将XML字符串的内容(我自己的sXML)转换为新的XML文件

时间:2014-03-14 10:23:01

标签: 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></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]

任何想法。

Br Frank Hinrichsen

2 个答案:

答案 0 :(得分:1)

您可以尝试以下样式表:

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

答案 1 :(得分:1)

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