1

私はこれに関して私がすべきよりも少し多くの問題を抱えており、正しいと思われる解決策を見つけることができませんでした:

xslt 1.0を使用してXMLドキュメントの名前空間を変更したいだけです。javaアプリケーションで使用され、javax.xml.transformを使用します。

これは私のxmlドキュメントです:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns="http://namespace1.org" type="Document" version="V2_2">
    <Content>
        <Text>asdf</Text>
    </Content>
</Root>

これは、変換後の外観です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns="http://namespace2.org" type="Document" version="V2_2">
    <Content>
        <Text>asdf</Text>
    </Content>
</Root>

これは私のxsltコードです:

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

  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

</xsl:stylesheet>

そして、これは私が変換後に得た実際の出力です:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Root xmlns:ns0="http://namespace2.org">2012-11-02T15:39:46.05+01:00DocumentV2_2<ns1:Content xmlns:ns1="http://namespace2.org">
  <ns2:Text xmlns:ns2="http://namespace2.org">asdf</ns2:Text>
 </ns1:Content>
</ns0:Root>

多くのプレフィックスを追加する方法がありますが、私は望んでいません。

次のxlstを使用して、ns+incrementプレフィックスを取り除くことができました。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns="http://namespace2.org"
 xmlns:cmp="http://namespace2.org"
 exclude-result-prefixes="cmp">

  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="*">
     <xsl:element name="cmp:{name()}" namespace="http://namespace2.org">
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates/>
     </xsl:element>
 </xsl:template>

</xsl:stylesheet>

これにより、次の出力が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<cmp:Root xmlns:cmp="http://namespace2.org" type="Document" version="V2_2">
 <cmp:Content>
  <cmp:Text>asdf</cmp:Text>
 </cmp:Content>
</cmp:Root>

しかし、「cmp」プレフィックスを取り除くことができませんでした。

どのように私が望ましい出力を達成することができるかについてのアイデアはありますか?

4

1 に答える 1

2

この一般的な変換(任意の XML ドキュメントに適用可能で、新しい名前空間がグローバル/外部パラメーターとして渡されます):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNewNS" select="'http://namespace2.org'"/>

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

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{$pNewNS}">
   <xsl:copy-of select="namespace::*[not(name() = '')]"/>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>

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

 <xsl:template match="@*[namespace-uri()=namespace-uri(/*)]">
  <xsl:attribute name="{name()}" namespace="{$pNewNS}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<Root xmlns="http://namespace1.org" type="Document" version="V2_2">
    <Content>
        <Text>asdf</Text>
    </Content>
</Root>

必要な正しい結果が生成されます。

<Root xmlns="http://namespace2.org" type="Document" version="V2_2">
   <Content>
      <Text>asdf</Text>
   </Content>
</Root>
于 2012-12-20T14:54:47.173 に答える