0

次の XML が定義されています。

<?xml version="1.0" encoding="UTF-8"?>
<ns0:container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="ns0.com" xsi:schemaLocation="ns0.com ns0.xsd">
   <ns1:elementA xmlns:ns1="ns1.com" xsi:schemaLocation="ns1.com ns1.xsd"/>
   <ns2:elementB xmlns:ns2="ns2.com" xsi:schemaLocation="ns2.com ns2.xsd"/>
</ns0:container>

問題は、消費するアプリケーションがコンテナー内の要素のみを取得し (残念ながら、コンテナーの文字列を切断することで)、名前空間 xsi の定義が欠落していることです。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance コンテナの各サブ要素にもを追加したいと思います。これは冗長な仕様になりますが、問題は発生しません。

だから、これは私が得たい結果です:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="container.com" xsi:schemaLocation="ns0.com ns0.xsd">
   <ns1:elementA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="ns1.com" xsi:schemaLocation="ns1.com ns1.xsd" />
   <ns2:elementB xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="ns2.com" xsi:schemaLocation="ns2.com ns2.xsd"/>
</ns0:container>

これが私のXSLTです。いくつかのオプションを試しましたが、できませんでした:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns0="ns0.com"
    xmlns:ns1="ns1.com"
    xmlns:ns2="ns2.com">
    <xsl:output method="xml" indent="no"/>

    <xsl:template match="ns0:container/*">
        <xsl:copy>
            <!-- Here I want to add the xmlns:xsi as attribute -->
            <xsl:attribute name="xsi">http://www.w3.org/2001/XMLSchema-instance</xsl:attribute>
            <!-- But this does not work - how should I do that? -->
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>

XSLT を使用して要素に xmlns:xsi="" を追加するにはどうすればよいですか?

4

2 に答える 2