复杂的根标签

时间:2011-10-08 19:02:07

标签: xml xslt tags

我有一个具有以下结构的xml文件:

<?xml version="1.0" encoding="utf-16"?>
<CSCNASN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AdvancedShipNotice.xsd">
  <RecordType0>
    <Darta1 />
    <Darta2 />
  </RecordType0>
  <RecordType1>
    <Darta1 />
    <Darta2 />
  </RecordType1>
</CSCNASN

我想删除标记CSCNASN (xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AdvancedShipNotice.xsd")旁边的所有部分,并创建一个结构相同但只带有标记CSCNASN的xml文件。

我尝试过这种转换,但它没有按照我的意愿工作。我定义了一个变量来选择所有的xml标签以便替换它。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/message">
        <xsl:variable name="fileName">
          <xsl:value-of select="@number"/>
        </xsl:variable>
              <xsl:variable name="outermostElementName" select="name(/*)" />

              <xsl:variable name="prova">"CSCNASN\ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AdvancedShipNotice.xsd""</xsl:variable>

            <message>

            <xsl:for-each select="./@*">
                <xsl:copy />
            </xsl:for-each>


            <xsl:for-each select="./$prova">
                <CSCNASN>
                   <xsl:attribute name="fileName">
                                     <xsl:value-of select="$fileName" />
                               </xsl:attribute>

                   <xsl:apply-templates select="node()" />

                           </CSCNASN>

            </xsl:for-each>
            </message>
    </xsl:template>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

这会返回没有命名空间的XML,猜猜你需要什么?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xx="AdvancedShipNotice.xsd">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
    <xsl:for-each select="xx:*">
        <xsl:call-template name="copy"/>
    </xsl:for-each>
</xsl:template>

<xsl:template name="copy">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*"/>
        <xsl:value-of select="text()"/>
        <xsl:for-each select="xx:*">
            <xsl:call-template name="copy"/>
        </xsl:for-each>
    </xsl:element>
</xsl:template>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

它返回以下内容:

<CSCNASN>
<RecordType0>
    <Darta1/>
    <Darta2/>
</RecordType0>
<RecordType1>
    <Darta1/>
    <Darta2/>
</RecordType1>
 </CSCNASN>