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 ノードとルート ノードを削除し、詳細ノードに小さな変更を加える必要があります。これを達成するために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 プロセッサ (プレフィックスの 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>
于 2012-10-23T15:49:04.720 に答える