1

输入文件:

<?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 节点,并且需要在 Detail 节点中做一些小的改动。如何编写 xslt 代码来实现这一点?

4

1 回答 1

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

要获得前缀重命名,我认为您必须使用支持 XML 1.1 的 XSLT 处理器(允许前缀未定义),但我找到了一种使用 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>
于 2012-10-23T15:49:04.720 回答