1

私はまだ XSL を学んでおり、XSL から取得した値を別の値に変更しようとしています。(オンライン Web サイトを使用して、XSL を使用して XML を別の XML に変換しています)

XML

<?xml version="1.0" encoding="UTF-8"?>
<Person>
    <Student>
        <Info Name="Jen" Age="20" Class="C" />
    </Student>
    <Student>
        <Info Name="Sam" Age="21" Class="B" />

    </Student>

</Person>

たくさんあるとstudentsしましょう(同じ名前でも)

XSLT

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

   <xsl:template match="Person">
      <Person>

        <lookuptable>
          <name first="Jen" ori="Jenny" />
          <name first="Sam" ori="Sammy" />
        </lookuptable>

         <xsl:for-each select="Student">
           <Info Name="{Info/@Name}" Age="{Info/@Age}" Class="{Info/@Class}" />
         </xsl:for-each>

      </Person>
   </xsl:template>
</xsl:stylesheet>

ルックアップテーブルを作成しました

出力は_

<?xml version="1.0" encoding="UTF-8"?>
<Person>
   <lookuptable>
      <name ori="Jenny" first="Jen" />
      <name ori="Sammy" first="Sam" />
   </lookuptable>
   <Info Class="C" Age="20" Name="Jen" />
   <Info Class="B" Age="21" Name="Sam" />
</Person>

つまり、「Jen」が表示されるたびに、ルックアップテーブルを使用して「Jenny」などになりたいということです。どうすればこれを達成できますか? または、別の XSL を作成して、出力(最後の XML) を必要な要件に変換する方が簡単ですか? 前もって感謝します..

4

2 に答える 2

1

ルックアップ テーブルを変数に入れ、ノード セット拡張を介して使用できます。http://www.xsltcake.com/で試してみました

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

  <xsl:variable name="lookuptable">
    <lookuptable>
      <name first="Jen" ori="Jenny" />
      <name first="Sam" ori="Sammy" />
    </lookuptable>
  </xsl:variable>

   <xsl:template match="Person">
      <Person>

        <xsl:copy-of select="$lookuptable"/>

         <xsl:for-each select="Student">
           <xsl:variable name="key" select="Info/@Name"/>
           <Info Age="{Info/@Age}" Class="{Info/@Class}">
             <xsl:attribute name="Name">
               <xsl:value-of select="exsl:node-set($lookuptable)/lookuptable/name[@first=$key]/@ori"/>
             </xsl:attribute>
           </Info>
         </xsl:for-each>

      </Person>
   </xsl:template>
</xsl:stylesheet>

詳細については、XSL に対する Pavel Minaev の回答: How best to store a node in a variable and then us it in future xpath expressions? を参照してください。 また、XSLT 2 を使用する場合は exsl 拡張機能が必要ないことも説明しています。そのため、XSLT 2 用に私のアプローチを改良することをお勧めします。

于 2013-10-01T04:32:15.363 に答える
1

@halfbitの答えのXSLT 2.0バージョンは次のとおりです(ルックアップテーブルを出力にコピーしていません。実際には必要ないと思いました):

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

  <xsl:variable name="lookuptable" as="element(name)*">
      <name first="Jen" ori="Jenny" />
      <name first="Sam" ori="Sammy" />
  </xsl:variable>

   <xsl:template match="Person">
      <Person>
         <xsl:for-each select="Student">
           <xsl:variable name="key" select="Info/@Name"/>
           <Info Age="{Info/@Age}" Class="{Info/@Class}">
             <xsl:attribute name="Name" select="$lookuptable[@first=$key]/@ori"/>
           </Info>
         </xsl:for-each>
      </Person>
   </xsl:template>
</xsl:stylesheet>
于 2013-10-01T06:14:27.527 に答える