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> 
+0

有用的参考资料:http://*.com/questions/4522226/xpath-predicate-to-macth-cdatasometext –

+0

另请参阅:http://*.com/questions/2067116/convert-an-xml-element -whose-content-is-inside-cdata –

在评论上面的链接的问题如上所述,你不能把CDATA作为XML的内容,它是纯粹的文本。在你的情况下(XSLT 1.0和简单文本替换),你可以使用一些EXSLT扩展模板,如replace()来匹配字符串和正则表达式,并用想要的价值。

+0

优秀的解决方案......谢谢。 – tranceporter

+0

糟糕的解决方案。切勿使用正则表达式解析XML - 最终总会导致悲伤。 –

+0

@Micaìhael - 我的建议不是使用正则表达式解析XML,而是替换文本。 –

您需要提取CDATA部分的文本并将其传递给XML解析器进行处理。一些XSLT处理器有一个扩展功能来执行此操作,例如saxon:parse(),或者您可以使用Java或Javascript编写自己的代码。

包含在CDATA部分中的任何内容都不是标记 - 它只是一维文本。

要么将​​其作为文本处理(这很丑且不方便),要么编写一个扩展函数,将其参数解析为一个XmlDocument并返回该结果。然后你就可以处理与XSLT结果:

<xsl:apply-templates select="my:parse(theString)/*"/> 

当然,对于这个工作,你必须确保传递给my:parse()扩展功能的文本是一个格式良好的XML文档(系列化) - 这在你的例子不是。