次の 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="" を追加するにはどうすればよいですか?