1

XML ファイルからすべての名前空間を削除したいのですが、次のような解決策が見つかりました。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

   <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

</xsl:stylesheet>

前の例に新しい xslt コードを追加するだけで、この xslt でこの XML を使用して他の編集操作 (新しいタグの作成、ノードの検索) を行うにはどうすればよいですか? 2 つの xslt ファイルを作成したくありません。一方のファイルで名前空間を削除し、別の xslt ファイルで編集操作を行います。

編集。たとえば、次の xml ソースがあります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
       <ns2:completeProductionPlan xmlns="http://ServiceManagement/OIS_Services_v01.00/common"
            xmlns:ns2="http://ServiceManagement/TechnicalOrderManagement/ProductionFulfillment_v01.00/types">
        <ns2:messageID>
            <value>9133235059913398501_9133235059913398860</value>
        </ns2:messageID>
    </ns2:completeProductionPlan>
    </soapenv:Body>
    </soapenv:Envelope>

これを取得したい:

<?xml version="1.0" encoding="UTF-8"?>
<CompletePP >
<MessageId>9133235059913398501_9133235059913398860</MessageId>
</CompletePP> 

そして、1 つの xslt ファイルで実行したいすべての xslt 操作

4

2 に答える 2

1

好きな xslt 操作を実行できます。注意する必要があるのは、元の xml の名前空間 uris だけです。xslt にアクセスしたい要素名の名前空間プレフィックスを追加する必要があります。プレフィックスの名前は xml とは異なる場合がありますが、同じものを使用すると読みやすくなります。ここに小さな例があります。
入力 XML:

<?xml version="1.0"?>
<xml xmlns:ns0="uri:test">
<ns0:Testing>
    <ns0:Cedent>
        <ns0:Party>
            <ns0:Id Agency=""></ns0:Id>
            <ns0:Name>Canada</ns0:Name>
        </ns0:Party>
    </ns0:Cedent>
    <ns0:Broker>
        <ns0:Party>
            <ns0:Id Agency="Legacy">292320710</ns0:Id>
            <ns0:Name>Spain</ns0:Name>
        </ns0:Party>
    </ns0:Broker>
</ns0:Testing>
</xml>

Party を test に名前変更するためにスタイル シートをほとんど変更せず、出力に名前空間がありません。試す:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:t="uri:test" 
                exclude-result-prefixes="t" >

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>
    <xsl:template match="t:Party">
        <test>
            <xsl:apply-templates select="@* | node()"/>
        </test>

    </xsl:template>

</xsl:stylesheet>

次の出力が生成されます。

<Testing>
    <Cedent>
        <test>
            <Id Agency=""/>
            <Name>Canada</Name>
        </test>
    </Cedent>
    <Broker>
        <test>
            <Id Agency="Legacy">292320710</Id>
            <Name>Spain</Name>
        </test>
    </Broker>
</Testing>
</xml>

質問の更新による更新:あなたの例では、これを試してください:

xmlns:common="http://ServiceManagement/OIS_Services_v01.00/common"
                exclude-result-prefixes="ns2 common" >

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>
    <xsl:template match="/">
        <CompletePP>
            <MessageId>
                <xsl:apply-templates select="//ns2:messageID/common:value"/>
            </MessageId>

        </CompletePP>

    </xsl:template>

</xsl:stylesheet>

次の出力が生成されます。

<CompletePP>
  <MessageId>
    <value>9133235059913398501_9133235059913398860</value>
  </MessageId>
</CompletePP>

コメントによる更新:要素に名前空間がないため、一部の要素 (値など) にアクセスできませんでした

まだ小さな誤解があるようです。たとえば、値の名前空間xmlns="http://ServiceManagement/OIS_Services_v01.00/common"は、これが値のコンテキストのデフォルトの名前空間であるためです。これは、値に名前空間がありますが、名前空間プレフィックスがないことを意味します。xslt から、 namespaceを持つすべての要素に名前空間プレフィックスを使用する必要があります。または、local-name() を使用する必要があります。

于 2013-05-17T09:03:39.987 に答える