XSL:修改XML中的内容
我有一个XML,其中有另一个XML(在CDATA中)。现在我想修改子XML的内容。这怎么可能?XSL:修改XML中的内容
在下面的XML中,如果Address Type是Home,我想将其更改为“01”。 在XSLT 1.0中可能吗?
<?xml>
<a>
<b>This is Parent</b>
<c>
<![CDATA[
<?xml>
<a1>This is Child XML></a1>
<person_address type="Home">
<street>ABCDStreet</street>
<city/>
<country/>
</person_address>
]]>
</c>
</a>
在评论上面的链接的问题如上所述,你不能把CDATA作为XML的内容,它是纯粹的文本。在你的情况下(XSLT 1.0和简单文本替换),你可以使用一些EXSLT扩展模板,如replace()
来匹配字符串和正则表达式,并用想要的价值。
优秀的解决方案......谢谢。 – tranceporter
糟糕的解决方案。切勿使用正则表达式解析XML - 最终总会导致悲伤。 –
@Micaìhael - 我的建议不是使用正则表达式解析XML,而是替换文本。 –
您需要提取CDATA部分的文本并将其传递给XML解析器进行处理。一些XSLT处理器有一个扩展功能来执行此操作,例如saxon:parse(),或者您可以使用Java或Javascript编写自己的代码。
包含在CDATA部分中的任何内容都不是标记 - 它只是一维文本。
要么将其作为文本处理(这很丑且不方便),要么编写一个扩展函数,将其参数解析为一个XmlDocument并返回该结果。然后你就可以处理与XSLT结果:
<xsl:apply-templates select="my:parse(theString)/*"/>
当然,对于这个工作,你必须确保传递给my:parse()
扩展功能的文本是一个格式良好的XML文档(系列化) - 这在你的例子不是。
有用的参考资料:http://stackoverflow.com/questions/4522226/xpath-predicate-to-macth-cdatasometext –
另请参阅:http://stackoverflow.com/questions/2067116/convert-an-xml-element -whose-content-is-inside-cdata –