Xslt 在字符串之间获取文本,对不同的语言具有不同的规则

Xslt get text between strings with different rules for different languages

提问人:demo 提问时间:8/28/2019 最后编辑:demo 更新时间:8/28/2019 访问量:35

问:

我正在使用 . 在页面上有一个 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>

因此,它应该在 和 之间选择文本。因此,它应该是byfromxxx

但是对于不是的语言来说,这是个问题。English

如果是西班牙语,html 看起来像

<span class="publisher_name">por xxx de TripAdvisor</span>

并返回,因为它找不到字符串。xsltstring.Emptyby

所以我想添加类似的规则来支持西班牙语字符串,也喜欢

<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) &gt; 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 &gt; 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>

html xml xslt html 解析

评论

0赞 Jack Fleeting 8/29/2019
顺便说一句,这也可以使用 xquery 来完成。

答:

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()