【问题标题】:convert the content of XML string (which i sXML itseself) into a new XML file将 XML 字符串(即 sXML 本身)的内容转换为新的 XML 文件
【发布时间】:2014-03-14 10:23:00
【问题描述】:

*源 XML 文件*

<TEXT_String xmlns="http://danfoss.com/xi/BCM">
![CDATA[<Document><BkToCstmrStmt><GrpHdr><MsgId>a</MsgId><CreDtTm>2001-12-17T09:30:47.0Z</CreDtTm></GrpHdr></BkToCstmrStmt></Document>]
</TEXT_String>

*所需的 XML 输出*

<Document>
 <BkToCstmrStmt>
  <GrpHdr>
    <MsgId>a</MsgId>
    <CreDtTm>2001-12-17T09:30:47.0Z</CreDtTm>
   </GrpHdr>
  </BkToCstmrStmt>
</Document>

我只获取字符串值,没有标签和 CDATA

![CDATA[a2001-12-17T09:30:47.0Z]

任何想法。

弗兰克·辛里希森先生

【问题讨论】:

    标签: xml xslt cdata


    【解决方案1】:

    源文档的问题在于 CDATA 标记不正确。结果,字符串![CDATA[] 就是:文本节点,根&lt;TEXT_String&gt; 元素的子节点。将身份转换模板应用于 XML 将导致:

    <?xml version="1.0" encoding="UTF-8"?>
    <TEXT_String xmlns="http://danfoss.com/xi/BCM">
    ![CDATA[<Document>
          <BkToCstmrStmt>
             <GrpHdr>
                <MsgId>a</MsgId>
                <CreDtTm>2001-12-17T09:30:47.0Z</CreDtTm>
             </GrpHdr>
          </BkToCstmrStmt>
       </Document>]
    </TEXT_String>
    

    添加一个模板来抑制作为根元素子元素的任何文本节点可能是一个很好的解决方案。或者,由于您似乎根本不希望将根元素包含在输出中,因此完全禁止它:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    
    <!-- not required for the example input -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
    
    <xsl:template match="/*">
        <xsl:apply-templates select="*"/>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下样式表:

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:BCM="http://danfoss.com/xi/BCM">
          <xsl:output omit-xml-declaration="yes" indent="yes"/>
          <xsl:strip-space elements="*"/>
      
          <xsl:template match="*">
              <xsl:element name="{local-name()}">
                  <xsl:apply-templates/>
              </xsl:element>
          </xsl:template>
      
          <xsl:template match="text()">
              <xsl:copy/>
          </xsl:template>
      
          <xsl:template match="/">
              <xsl:apply-templates select="BCM:TEXT_String/*"/>
          </xsl:template>
      </xsl:stylesheet>
      

      【讨论】:

      • "错误:/TEXT_String/Document[1]/BkToCstmrStmt[1]/GrpHdr[1]/MsgId[1]/text()[1] 的不明确规则匹配同时匹配“ file:stylesheet.xsl 第 11 行的 text()" 和 file:stylesheet.xsl 第 5 行的 "node()"" 由 Saxon 提供。
      • 直到您发表评论后我才注意到这一点。编辑了我上面的帖子。谢谢
      • @michael.hor257k 我不在家时使用在线工具,是的,如果它们不会导致完全失败,它确实不会显示错误。你说得对,我马上删除我的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2012-02-28
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多