我想用元素替换一个特殊的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。帮助获得更好的冠军欢迎; - )
答案 0 :(得分:1)
如果您希望将文本节点的模板应用于所有文本节点,则必须使用apply-templates
而不是value-of
来保持递归处理,即
<xsl:template match="delement">
<replacedElement>
<xsl:apply-templates/>
</replacedElement>
</xsl:template>
您还可以简化文本节点的匹配模式,只需使用match="text()"
。