提问人:demo 提问时间:8/28/2019 最后编辑:demo 更新时间:8/28/2019 访问量:35
Xslt 在字符串之间获取文本,对不同的语言具有不同的规则
Xslt get text between strings with different rules for different languages
问:
我正在使用 .
在页面上有一个 html 和平,我想从中接收发布者名称xslt
<div>
<span class="publisher_name">by xxx from TripAdvisor</span>
</div>
为了解析它,我使用下面的代码:
<xsl:variable name="publisherTextNode" select=".//span[@class='publisher_name'][1]"/>
<xsl:if test="$publisherTextNode">
<Publisher>
<xsl:call-template name="string-trim">
<xsl:with-param name="string" select="substring-before(substring-after($publisherTextNode, 'by'), 'from')" />
</xsl:call-template>
</Publisher>
</xsl:if>
因此,它应该在 和 之间选择文本。因此,它应该是by
from
xxx
但是对于不是的语言来说,这是个问题。English
如果是西班牙语,html 看起来像
<span class="publisher_name">por xxx de TripAdvisor</span>
并返回,因为它找不到字符串。xslt
string.Empty
by
所以我想添加类似的规则来支持西班牙语字符串,也喜欢
<xsl:with-param name="string" select="substring-before(substring-after($publisherTextNode, 'por'), 'de')" />
我可以以某种方式将这 2 条规则添加到现有的 xslt 架构中吗(也许检查第一个规则是否返回字符串。空然后使用第二条规则?还是为不同的语言创建单独的?
<xsl:template name="string-trim">
<xsl:param name="string" />
<xsl:param name="trim" select="$whitespace" />
<xsl:call-template name="string-rtrim">
<xsl:with-param name="string">
<xsl:call-template name="string-ltrim">
<xsl:with-param name="string" select="$string" />
<xsl:with-param name="trim" select="$trim" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="trim" select="$trim" />
</xsl:call-template>
<xsl:template name="string-ltrim">
<xsl:param name="string" />
<xsl:param name="trim" select="$whitespace" />
<xsl:if test="string-length($string) > 0">
<xsl:choose>
<xsl:when test="contains($trim, substring($string, 1, 1))">
<xsl:call-template name="string-ltrim">
<xsl:with-param name="string" select="substring($string, 2)" />
<xsl:with-param name="trim" select="$trim" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string" />
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:template name="string-rtrim">
<xsl:param name="string" />
<xsl:param name="trim" select="$whitespace" />
<xsl:variable name="length" select="string-length($string)" />
<xsl:if test="$length > 0">
<xsl:choose>
<xsl:when test="contains($trim, substring($string, $length, 1))">
<xsl:call-template name="string-rtrim">
<xsl:with-param name="string" select="substring($string, 1, $length - 1)" />
<xsl:with-param name="trim" select="$trim" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string" />
</xsl:otherwise>
</xsl:choose>
</xsl:if>
答:
1赞
michael.hor257k
8/28/2019
#1
像 (XSLT 1.0) 这样的东西怎么样:
<xsl:call-template name="string-trim">
<xsl:with-param name="string">
<xsl:choose>
<xsl:when test="contains($publisherTextNode, 'by ') and contains($publisherTextNode, ' from')">
<xsl:value-of select="substring-before(substring-after($publisherTextNode, 'by '), ' from')" />
</xsl:when>
<xsl:when test="contains($publisherTextNode, 'por ') and contains($publisherTextNode, ' de')">
<xsl:value-of select="substring-before(substring-after($publisherTextNode, 'por '), ' de')" />
</xsl:when>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
请注意,在测试中出现误报的可能性很小。
评论
0赞
demo
8/28/2019
谢谢,它正在工作......但是,是的,你的笔记很重要)
1赞
michael.hor257k
8/28/2019
如果您的示例是指示性的,则可以通过在第一个条件中将 替换为 来减少机会。contains()
starts-with()
评论