模板匹配未应用于嵌套元素文本

时间:2018-01-30 07:36:37

标签: xml xslt replace

我想用元素替换一个特殊的char。这在单独执行最后一个模板时已经有效。

<!-- copy whole xml -->
<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

<!-- rename delement to replacedElement and only copy its text> -->
<xsl:template name="delement">
    <xsl:element name="replacedElement"
        <xsl:value-of select="text()"/>
    </xsl:element>
</xsl:template> 

<!-- replace special char with element -->
<xsl:template match="descendant-or-self::text()">
    <xsl:analyze-string select="." regex="-">
        <xsl:matching-substring>
            <elementForSC/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

当复制更深/嵌套元素的文本时,问题似乎是第二个模板匹配。这个文本也包含特殊字符,但没有被替换。

示例:

<body>
     just some text but - char is replaced here.
     <delement>
          here text with - in it but it didn't get replaced
     </delement>
</body>

结果:

<body>
     just some text but <elementForSC/> char is replaced here.
     <replacedElement>
           here text with - in it but it didn't get replaced 
     </replacedElement>
</body>

有关如何在修改/复制的文本上递归应用特殊字符替换“规则”的任何想法吗?

P.S。帮助获得更好的冠军欢迎; - )

1 个答案:

答案 0 :(得分:1)

如果您希望将文本节点的模板应用于所有文本节点,则必须使用apply-templates而不是value-of来保持递归处理,即

<xsl:template match="delement">
  <replacedElement>
    <xsl:apply-templates/>
  </replacedElement>
</xsl:template>

您还可以简化文本节点的匹配模式,只需使用match="text()"