1

たとえば、プロパティ ファイルを XML 形式で保存する場合

<Properties>
    <Property value="abc">ABC1</Property>
    <Property value="...">...</Property>
</Properties>

次に、xslt を使用して両方の (プロパティ、入力) XML ファイルを処理し、(入力 xml ファイルの) abc 要素を (カスタム出力 xml ファイルの) ABC1 要素などに置き換えることができます。

たとえば、以下の入力xmlファイルを検討してください

<?xml version="1.0" encoding="UTF-8"?>
       <Content>
          <abc>xxx
                 <def>zzz
                    <ghi>ccc</ghi>ttt
                     <dynamic val="hello" xmlns="http://abc.com" />
                      world
                     <dynamic val="hi" xmlns="http://abc.com" />
                       <dynAttr>
                         <dyn value=123 />
                         <dyn value=222 />
                       </dynAttr>
                         <lmn>data</lmn>

                   </def>
                </abc>
         </Content>

入力xmlファイルのタグごとに定義されたプロパティで構成されるPropertiesファイルを使用して、その入力xmlファイルのタグにプロパティが定義されていない場合、変換されたxmlタグは入力xmlファイルのタグと同じタグ名になります。

<?xml version="1.0" encoding="UTF-8"?>
<Properties>
             <Property value="Content">CONTENT12</Property>
             <Property value="abc">ABC1</Property>
             <Property value="def">www</Property>
              <Property value="ghi">yyy</Property>
             <Property value="dynamic">Dynamic1</Property>
             <Property value="dynAttr">DynAttribute</Property>
</Properties>

xslt を使用し、プロパティ xml ファイルを参照する xsl ファイルを作成し、指定された入力 xml ファイルに適用すると、次のように変換された xml ファイルになります。

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

                <www>zzz
                    <yyy>ccc</yyy>ttt
                     <Dynamic1 val="hello" xmlns="http://abc.com>hello</Dynamic1>
                      world
                     <Dynamic1 val="hi" xmlns="http://abc.com>hi</Dynamic1>
                       <DynAttribute>
                         <dyn>123</dyn>
                         <dyn>222</dyn>
                       </DynAttribute>
                         <lmn>data</lmn>
                   </www>
if the above code is my requirement then what must be the relative xpath expression in your answer <xsl:template match=" ">
4

1 に答える 1

2

サンプルファイルは整形式ではありませんが、それを修正し、プロパティファイルがprop.xmlの場合、これは機能するはずです。

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


<xsl:template match="*">
 <xsl:variable name="n" select="name()"/>
 <xsl:variable name="new">
  <xsl:for-each select="document('prop.xml')">
   <xsl:choose>
    <xsl:when test="key('n',$n)">
     <xsl:value-of select="key('n',$n)"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="$n"/>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each>
 </xsl:variable>
 <xsl:element name="{$new}">
  <xsl:copy-of select="@*"/>
  <xsl:apply-templates/>
 </xsl:element>
</xsl:template>

<xsl:key name="n" match="Property" use="@value"/>

</xsl:stylesheet>

あなたの質問は、名前空間の名前が変更された要素がどのようにあるべきかを述べていません。上記のコードは常にそれらを名前空間なしに置きます。それらを元の名前空間と同じ名前空間にしたい場合は、xsl:element行を次のように変更します。

 <xsl:element name="{$new}" namespace="{namespace-uri()}">

最も柔軟な代替手段は、おそらくプロパティファイルでローカル名と名前空間URIの両方を指定することです。

アップデート

コメントと更新された回答に記載されているように、名前空間を保持し、def要素のみを処理する場合は、次のように小さな変更を加えます。

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


<xsl:template match="/">
 <xsl:apply-templates select="//def"/>
</xsl:template>

<xsl:template match="*">
 <xsl:variable name="n" select="name()"/>
 <xsl:variable name="new">
  <xsl:for-each select="document('prop.xml')">
   <xsl:choose>
    <xsl:when test="key('n',$n)">
     <xsl:value-of select="key('n',$n)"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="$n"/>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each>
 </xsl:variable>
 <xsl:element name="{$new}" namespace="{namespace-uri()}">
  <xsl:copy-of select="@*"/>
  <xsl:apply-templates/>
 </xsl:element>
</xsl:template>

<xsl:key name="n" match="Property" use="@value"/>

</xsl:stylesheet>
于 2012-04-08T13:20:57.047 に答える