1

私はこのような入力XMLを持っています -

<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes.com" xmlns:def="www.calculations.com">
    <ID>A1</ID>
    <abc:Date>2005-11-20</abc:Date>
    <Type>12345</Type>
    <def:Maths>Multiply</def:Maths>
</Integer>

XSL 1.0 を使用して、名前空間をルート要素に追加したいと考えています。接頭辞は同じですが、値は異なります。出力を次のようにしたい-

<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
    <ID>A1</ID>
    <abc:Date>2005-11-20</abc:Date>
    <Type>12345</Type>
    <def:Maths>Multiply</def:Maths>
</Integer>

提案してください。

4

2 に答える 2

0

より短い解決策

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

 <xsl:variable name="vNS" select=
   "document('')/*/namespace::*[name()='abc' or name()='def']"/>
 <xsl:variable name="vDefNS" select="/*/namespace::*[not(name())]"/>

 <xsl:template match="*">
  <xsl:element name="{name()}">
       <xsl:copy-of select="$vDefNS"/>
       <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="*[name()=local-name()]">
     <xsl:element name="{name()}" namespace="{$vDefNS}">
       <xsl:copy-of select="$vNS"/>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:element>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合(提供されているものと同じですが、より代表的なものにするために属性が追加されています)。

<Integer xmlns="www.maths.com"
 xmlns:abc="www.dateTypes.com" xmlns:def="www.calculations.com">
    <ID>A1</ID>
    <abc:Date>2005-11-20</abc:Date>
    <Type abc:x="1">12345</Type>
    <def:Maths>Multiply</def:Maths>
</Integer>

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

<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
   <ID>A1</ID>
   <abc:Date>2005-11-20</abc:Date>
   <Type abc:x="1">12345</Type>
   <def:Maths>Multiply</def:Maths>
</Integer>
于 2013-01-22T13:42:34.250 に答える
0

これでうまくいくはずです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0"
                xmlns:oldabc="www.dateTypes.com" xmlns:olddef="www.calculations.com"
                xmlns:maths="www.maths.com"
                exclude-result-prefixes="oldabc olddef maths">
  <xsl:output method="xml" indent="yes"/>

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

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

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

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

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

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

  <xsl:template match="/maths:Integer">
    <Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
      <xsl:apply-templates select="@* | node()"/>
    </Integer>
  </xsl:template>
</xsl:stylesheet>

上記の XSLT を入力例で実行すると、期待どおりの結果が得られます。

<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
  <ID>A1</ID>
  <abc:Date>2005-11-20</abc:Date>
  <Type>12345</Type>
  <def:Maths>Multiply</def:Maths>
</Integer>
于 2013-01-22T10:47:52.467 に答える