如何使用XSLT删除根节点?

时间:2012-10-23 13:37:01

标签: xslt

  

输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:root xmlns:ns0="http://xyz.com/separate">
    <ns0:root1>
        <ns3:Detail xmlns:ns3="http://POProject/Details">
        <DetailLines>
                <ItemID>
                <ItemDescription/>
            </DetailLines>
        </ns3:Detail>
    </ns0:root1>
</ns0:root>
  

输出文件:

<?xml version="1.0" encoding="UTF-8"?>
        <ns0:Detail xmlns:ns0="http://POProject/Details">
        <DetailLines>
                <ItemID>
                <ItemDescription/>
            </DetailLines>
        </ns0:Detail>
  

问题:我必须删除root1和root节点,并且需要做小事   细节节点中的更改。如何编写一个xslt代码来实现这个目标?

1 个答案:

答案 0 :(得分:1)

:此...

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://xyz.com/separate"
  xmlns:ns3="http://POProject/Details">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="/">
  <xsl:apply-templates select="*/*/ns3:Detail" />
</xsl:template>

<xsl:template match="ns3:Detail">
  <xsl:apply-templates select="." mode="copy-sans-namespace" />
</xsl:template>

<xsl:template match="*" mode="copy-sans-namespace">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates mode="copy-sans-namespace" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

...会产生这个......

<?xml version="1.0" encoding="utf-8"?>
<ns3:Detail xmlns:ns3="http://POProject/Details">
  <DetailLines>
    <ItemID />
    <ItemDescription />
  </DetailLines>
</ns3:Detail>

我不确定是否可以控制前缀。 XDM数据模型不认为它是重要信息。


UDPATE

为了获得前缀重命名,我认为你必须转到支持XSLT处理器的XML 1.1(允许前缀undefine),但我找到了一种方法来使用XML 1.0。试试这个......

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://xyz.com/separate">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="/" xmlns:ns3="http://POProject/Details">
  <xsl:apply-templates select="*/*/ns3:Detail" />
</xsl:template>

<xsl:template match="ns0:Detail" xmlns:ns0="http://POProject/Details">
  <ns0:Detail xmlns:ns0="http://POProject/Details">
    <xsl:apply-templates select="*" mode="copy-sans-namespace" />
  </ns0:Detail>  
</xsl:template>

<xsl:template match="*" mode="copy-sans-namespace">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates mode="copy-sans-namespace" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>