0

在我的一条 xml 消息中,我有一个特定的标签,其中一些(未知的)最后位置填充了一个特定的字符(/)。但是在 XSLT 期间,我想删除这个字符并在最后一个位置生成另一个没有该字符的字符串。

4

2 回答 2

1

您的问题非常模糊,但是您将创建一个身份转换,递归地复制每个元素,并为要修改的元素使用特殊模板,如下所示

<xsl:template match="particular-tag">
  <xsl:copy>
    <xsl:value-of select="substring-before(., '/')"/>
  </xsl:copy>
</xsl:template>

这将从每个<particular-tag>元素的第一个斜杠开始删除所有字符。

于 2013-06-20T16:46:16.220 回答
0

如果我正确理解了这个问题,那么您的字符串可能以零个或多个斜杠结尾;您想要一个函数或模板从字符串中去除尾部斜杠 - 但不是其他斜杠。在 XSLT 2.0 中,最简单的做法是编写一个函数来执行此操作。函数的写法有很多种;一个简单的就是这个(它概括了从字符串末尾剥离任何给定字符的问题,而不仅仅是斜杠):

<xsl:function name="my:strip-trailing-char">
  <xsl:param name="s" required="yes"/>
  <xsl:param name="c" required="yes"/>

  <xsl:choose>
    <xsl:when test="ends-with($s,$c)">
      <xsl:value-of select="my:strip-trailing-char(
             substring($s,1,string-length($s) - 1), 
             $c
      )"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$s"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:function>

在 XSLT 1.0 中,您可以对命名模板执行相同的操作:

<xsl:template name="my:strip-trailing-char">
  <xsl:param name="s" required="yes"/>
  <xsl:param name="c" required="yes"/>

  <xsl:choose>
    <xsl:when test="ends-with($s,$c)">
      <xsl:call-template name="my:strip-trailing-char">
        <xsl:with-param name="s" 
          select="substring($s,1,string-length($s) - 1)"/>
        <xsl:with-param name="c" select="$c"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$s"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
于 2013-06-21T16:46:24.020 回答