【问题标题】:XSL: Modify contents within XMLXSL:修改 XML 中的内容
【发布时间】:2011-07-15 08:49:58
【问题描述】:

我有一个 XML,其中有另一个 XML(在 CDATA 中)。现在我想修改子 XML 的内容。怎么可能?

在下面的 XML 中,如果地址类型是 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>

【问题讨论】:

标签: xml xslt cdata


【解决方案1】:

正如评论中上面链接问题中所述,您不能将 CDATA 的内容视为 XML,它是纯文本。

想到的第一个简单的解决方案(不是最好的解决方案):在您的情况下(XSLT 1.0 和简单的文本替换),您可以使用一些 EXSLT 扩展模板,如 replace() 将字符串与正则表达式匹配并将其替换为想要的价值。

【讨论】:

  • 错误的解决方案。永远不要使用正则表达式来解析 XML - 最终总是会导致悲伤。
  • @Micaìhael - 我的建议不是使用正则表达式解析 XML,而是替换文本。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    要么将其作为文本处理(既丑陋又不方便),要么编写一个扩展函数,将其参数解析为 XmlDocument 并返回此结果。然后您可以使用 XSLT 处理结果:

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

    当然,要使其正常工作,您必须确保传递给 my:parse() 扩展函数的文本是格式良好(序列化)的 XML 文档——在您的示例中并非如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2023-03-03
      • 2011-02-11
      • 2014-08-03
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多