2

要素にデフォルトの名前空間(変換時)を追加したい。この変換には xslt を使用しました。以下のコード スニペットを見つけてください。

<xsl:variable name="ns" select="'http://ABC.org/Standards/SChool/2'" />

<xsl:element name="School" namespace="{$ns}">
     <xsl:attribute name="Version">2.13.92</xsl:attribute>    
     <xsl:apply-templates select="ltc:UserAuthRequest" />
</xsl:element>

<xsl:template match="ltc:UserAuthRequest">
     <xsl:element name="{local-name()}">
</xsl:template>

変換後、次の xml 出力が得られました。

<School xmlns="http://ABC.org/Standards/SChool/2" Version="2.13.92">
     <UserAuthRequest xmlns=""></UserAuthRequest>
</School>

ここでの問題は、デフォルトの名前空間が子ノードにも作成されたことです。

名前空間が子要素に作成された理由と、その名前空間を定義していないのに、この問題を回避する方法を教えてください。

入力 XML

<?xml version="1.0" encoding="UTF-8"?>
<School>

    <UserAuth>
        <UserName>K.Senthuran</UserName>
        <Password>Javaworld</Password>
    </UserAuth>

</School>

変換ロジック

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

    <xsl:template match="/School">

        <xsl:variable name="ns">www.school.com/myLife</xsl:variable>
        <xsl:element name="School" namespace="{$ns}">
            <xsl:apply-templates select="UserAuth" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="UserAuth">
        <xsl:element name="UserAuth">
            <xsl:attribute name="id">sdmnsdnk</xsl:attribute>

            <xsl:apply-templates select="UserName" />
            <xsl:apply-templates select="Password" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="UserName">
        <xsl:element name="{local-name()}">
            <xsl:attribute name="userIDREF">dmsdmsl</xsl:attribute>

            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

    <xsl:template match="Password">

        <xsl:element name="{local-name()}">
            <xsl:attribute name="uniqueIDREF">asakjhs</xsl:attribute>

            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

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

</xsl:stylesheet>

電流出力

<?xml version="1.0" encoding="UTF-8"?>
<School xmlns="www.school.com/myLife">
    <UserAuth xmlns="" id="sdmnsdnk">
        <UserName userIDREF="dmsdmsl">K.Senthuran</UserName>
        <Password uniqueIDREF="asakjhs">Javaworld</Password>
    </UserAuth>
</School>

期待される出力

<?xml version="1.0" encoding="UTF-8"?>
<School xmlns="www.school.com/myLife">
    <UserAuth id="sdmnsdnk">
        <UserName userIDREF="dmsdmsl">K.Senthuran</UserName>
        <Password uniqueIDREF="asakjhs">Javaworld</Password>
    </UserAuth>
</School>
4

2 に答える 2

2

問題は、UserAuthRequestを作成するときに名前空間を与えていないことです

<xsl:element name="{local-name()}" />

したがって、XSLT は名前空間のない要素を生成するため、xmlns="". ns変数がスコープ内でグローバルであると仮定すると、 School要素の場合と同じ方法で要素を作成するだけです

<xsl:element name="{local-name()}" namespace="{$ns}" />

実際、特定の要素に一致する場合、ここでlocal-nameは必要ありません。これも機能します

<xsl:element name="UserAuthRequest" namespace="{$ns}" />
于 2013-03-29T09:43:00.083 に答える
1

これを行う方法は次のとおりです。

<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:variable name="vNs" select="'some:NS'"/>

 <xsl:template match="*">
     <xsl:element name="{name()}" namespace="{$vNs}">
       <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:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<School Version="2.13.92">
     <UserAuthRequest></UserAuthRequest>
</School>

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

<School xmlns="some:NS" Version="2.13.92">
   <UserAuthRequest/>
</School>

更新

OPは彼の質問を明確にしました。ここで、追加の要件として、いくつかの要素に新しい属性を追加する必要があります。

<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:variable name="vNs" select="'some:NS'"/>

 <xsl:template match="*">
     <xsl:element name="{name()}" namespace="{$vNs}">
       <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="UserAuth">
  <xsl:element name="{name()}" namespace="{$vNs}">
   <xsl:attribute name="id">sdmnsdnk</xsl:attribute>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="UserName">
  <xsl:element name="{name()}" namespace="{$vNs}">
   <xsl:attribute name="userIDREF">dmsdmsl</xsl:attribute>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
 <xsl:template match="Password">
  <xsl:element name="{name()}" namespace="{$vNs}">
   <xsl:attribute name="uniqueIDREF">asakjhs</xsl:attribute>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<School>
    <UserAuth>
        <UserName>K.Senthuran</UserName>
        <Password>Javaworld</Password>
    </UserAuth>
</School>

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

<School xmlns="some:NS">
   <UserAuth id="sdmnsdnk">
      <UserName userIDREF="dmsdmsl">K.Senthuran</UserName>
      <Password uniqueIDREF="asakjhs">Javaworld</Password>
   </UserAuth>
</School>
于 2013-03-29T14:24:28.083 に答える