【问题标题】:Extract CDATA from an element using xsl使用 xsl 从元素中提取 CDATA
【发布时间】:2013-05-17 20:43:51
【问题描述】:

输入:(XML)

<A1Result xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <![CDATA[
    <?xml version="1.0" encoding="UTF-8" ?>
    <ABCD_XML_DATA>
        <Header>
            <MessageId>AGDMY1323292534488</MessageId>
        </Header>
    </ABCD_XML_DATA>
    ]]>
</A1Result>

我需要使用 xsl 的输出:

<ABCD_XML_DATA>
    <Header>
        <MessageId>AGDMY1323292534488</MessageId>
    </Header>
</ABCD_XML_DATA>

附加信息,我的 i/p 和 o/p 写入/写入变量。

我试过了,

<xsl:variable name="Data"> 
    <xsl:value-of select="$A1Result" disable-output-escaping="yes"/> 
</xsl:variable>

请建议如何实现这一点,谢谢。

【问题讨论】:

    标签: xml xslt cdata


    【解决方案1】:

    终于想通了,Borodin(下)的原始答案也有效。我必须解析 i/p,我的处理器才能识别。

    (我使用的是 dp xsl 处理器,所以命名空间为 dp);我昨天也在尝试同样的事情,但没有运气;我必须解析它才能工作。

    <xsl:copy-of select="dp:parse(dp:variable('var://context/saved/MyRes')//*[local-name()='A1Result'])" disable-output-escaping="yes"/> 
    

    其中,“var://context/saved/MyRes”包含来自问题的输入 xml。

    谢谢大家。

    【讨论】:

      【解决方案2】:

      您的源 XML 格式不正确,因为在根元素的开始标记之后不能有 XML 声明。

      假设应将此声明移至文件顶部,您可以编写一个 XSLT 转换,使用 text 输出方法生成您想要的。

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
      
        <xsl:output method="text"/>
      
        <xsl:template match="/">
        <xsl:value-of select="A1Result"/>
        </xsl:template>
      
      </xsl:stylesheet>
      

      输出

      <ABCD_XML_DATA>
          <Header>
              <MessageId>AGDMY1323292534488</MessageId>
          </Header>
      </ABCD_XML_DATA>
      

      更新

      如果你想从 CDATA 中删除 XML 声明,那么你能做的最好的就是使用

      <xsl:value-of select="substring-after(A1Result, '?>')"/>
      

      【讨论】:

      • 另外,输入被保存在一个变量中。我不能以 root 身份匹配。
      • @user2395396:我已经更新了我的答案来处理你的第一条评论。您现在是说整个 XML 文档是一个 XSLT 变量值吗?
      • 是的。我正试图将它再次保存在一个变量中。有问题添加了更多信息。
      • @Borodin 这不对。在 CDATA 中允许使用除 ]]&gt; 之外的任何内容 - 请参阅 w3.org/TR/REC-xml/#sec-cdata-sect “在 CDATA 部分中,只有 CDEnd 字符串被识别为标记,因此左尖括号和 & 符号可能以其文字形式出现;它们不需要(也不能) 使用 " < "和" & "。CDATA 部分不能嵌套。"
      • @peter.murray.rust:对不起,有什么不对吗?我看不出你引用的内容与我写的任何内容有冲突。
      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2011-02-27
      • 2019-02-15
      • 2012-08-17
      • 1970-01-01
      • 2011-07-10
      • 2019-11-01
      相关资源
      最近更新 更多