XSLT将char替换为元素
我试图用一个元素(包含更多元素)替换单个字符。 使用XSL2.0 例如:XSLT将char替换为元素,xslt,replace,Xslt,Replace,我试图用一个元素(包含更多元素)替换单个字符。 使用XSL2.0 例如: <element1> <element2>some text and the char - I want to replace </element2> ... </element1> 一些文本和字符-我想替换 ... 现在应使用新元素替换-(破折号): <element1> <element2>some text and
<element1>
<element2>some text and the char - I want to replace </element2>
...
</element1>
一些文本和字符-我想替换
...
现在应使用新元素替换-(破折号):
<element1>
<element2>some text and the char <newElement/> I want to replace </element2>
...
</element1>
一些文本和我要替换的字符
...
我已经试过了:
<xsl:template match="element1">
<xsl:analyze-string select="." regex="-">
<xsl:matching-substring>
<newElement/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
但这会删除中间的所有其他元素(因为只“返回”字符串)
使用函数replace(),您只能插入字符串(无您的模板匹配
元素()
,但替换文本()
。如果您在复制其余内容时匹配文本()
并替换文本()
,它将按预期工作:
<!-- modified identity template matching no text() nodes -->
<xsl:template match="element() | comment() | processing-instruction()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:analyze-string select="." regex="-">
<xsl:matching-substring>
<newElement/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:copy-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
需要两个更正:
- 您的模板应该匹配
,而不是element2
element1
- 在tempate的开头和结尾,您应该添加
元素2的开始/结束标记(类似于 标识模板)
<xsl:template match="element2">
<element2>
<xsl:analyze-string select="." regex="-">
<xsl:matching-substring>
<newElement/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</element2>
</xsl:template>
当然,您的脚本还应该包括标识模板。匹配angaist text()完成了此操作。现在的问题是,此匹配不适用于子节点的文本。它使用
子节点或self::text()进行了尝试
但没有成功。问题是由另一个模板匹配引起的,该模板匹配重命名元素并复制其文本……有没有任何想法如何始终强制匹配?因为这不是示例的一部分,很难判断。我测试了XML一些我喜欢的文本-它!和字符-我想替换的
,结果与预期一致。“修改的标识模板”也不包括text()
节点。也许这对你来说是一个灵感。否则,我想最好创建一个新问题,并举例说明确切的问题是什么。