xsl替换匹配':'但不是':'

时间:2017-02-24 02:23:01

标签: xml xslt

我有一个xml文件,我正在通过xsl处理成csv文件。除了以外,它的工作非常好。 源xml包含一个节点,其值是分隔字符串 - 分隔符是冒号。 分隔字符串中的部分可能包含冒号 我需要用\

替换分隔符

即我的xml看起来像这样:

<docnode>
  <group>
    <parent>
      <child>value1a:value2:value3 part1: part2</child>
      <other>some other stuff I don't care about</other>
    </parent>
  <group>
  </group>
    <parent>
      <child>value1b:value2:value3 part1: part2</child>
      <other>some other stuff I don't care about</other>
    </parent>
  </group>
</docnode>

我的xsl目前有:

<xsl:for-each select="group"><xsl:value-of select="translate(parent/child,':','\')"/></xsl:for-each>

此输出

value1a\value2\value3 part1\ part2
value1b\value2\value3 part1\ part2

我需要:

value1a\value2\value3 part1: part2
value1b\value2\value3 part1: part2

我知道它的坚果,但我无法控制格式。

我认为我应该能够使用正则表达式:[\ S],它将匹配一个后面没有空格的冒号。

我无法找到有关正则表达式的任何内容:translate(仅限正则表达式:替换) 例如:     

当我尝试其中任何一个选项时,xsl都没有给我任何东西

帮助?? !!

1 个答案:

答案 0 :(得分:0)

假设您使用的是XSLT 1.0处理器,没有扩展功能,则必须执行以下操作:

<xsl:template match="/docnode">
    <xsl:for-each select="group">
        <xsl:call-template name="replace">
            <xsl:with-param name="string" select="parent/child"/>
        </xsl:call-template>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

<xsl:template name="replace">
    <xsl:param name="string"/>
    <xsl:choose>
        <xsl:when test="contains($string, ':')">
            <xsl:value-of select="substring-before($string, ':')"/>
            <xsl:choose>
                <xsl:when test="starts-with(substring-after($string, ':'), ' ')">:</xsl:when>
                <xsl:otherwise>\</xsl:otherwise>
            </xsl:choose>
            <xsl:call-template name="replace">
                <xsl:with-param name="string" select="substring-after($string, ':')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$string"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>