Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML字符串的内容(我使用sXML本身)转换为新的XML文件_Xml_Xslt_Cdata - Fatal编程技术网

将XML字符串的内容(我使用sXML本身)转换为新的XML文件

将XML字符串的内容(我使用sXML本身)转换为新的XML文件,xml,xslt,cdata,Xml,Xslt,Cdata,*源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></Docum

*源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>
<Document>
 <BkToCstmrStmt>
  <GrpHdr>
    <MsgId>a</MsgId>
    <CreDtTm>2001-12-17T09:30:47.0Z</CreDtTm>
   </GrpHdr>
  </BkToCstmrStmt>
</Document>
任何想法


Br Frank Hinrichsen

您可以尝试以下样式表:

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

源文档的问题在于CDATA标记不正确。因此,字符串
![CDATA[
]
只是:文本节点,根
元素的子元素。将身份转换模板应用于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>

![CDATA[
A.
2001-12-17T09:30:47.0Z
]
添加模板以抑制作为根元素子元素的任何文本节点可能是一个很好的解决方案。或者,由于您似乎根本不希望根元素包含在输出中,只需完全抑制它:

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


“错误:/TEXT_String/Document[1]/BkToCstmrStmt[1]/GrpHdr[1]/MsgId[1]/TEXT()[1]的不明确规则匹配与文件:stylesheet.xsl第11行的“TEXT()”和文件:stylesheet.xsl第5行的“node()”都匹配”由萨克森提供。在你发表评论之前,我没有注意到这一点。编辑了我上面的帖子。thanks@michael.hor257k当我不在家时,我会使用一个在线工具,是的,如果没有导致完全失败,它确实不会显示错误。你是对的,我会马上删除我的评论。
<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>