1

私は次のドキュメントのスタイルシートを作成しようとしています。このスタイルシートでは、すべてのユーザーの賞を確認し、そのユーザーの名前をサブ要素として/ Awards/award要素に追加できます。

<document>
    <users>
        <user identity="1">
            <name>
                <first>abc</first>
                <last>xyz</last>
            </name>
            <achievements>
                <achievement>Award A</achievement>
                <achievement>Award B</achievement>
            </achievements>
        </user>
        <user identity="2">
            <name>
                <first>123</first>
                <last>DEF</last>
            </name>
            <achievements>
                <received>Award A</received>
            </achievements>
        </user>
        <user identity = "3">
            <name>
                <first>aaa</first>
                <last>bbb</last>
            </name>
            <achievements>
                <received>Award B</received>
            </achievements>
        </user>
    </users>
    <!--awards-->
    <awards>
        <award>
            <name>Award A</name>
            <!--here the list of the users who recieved this award has to be included-->
        </award>
        <award>
            <name>Award B</name>
        </award>
    </awards>
</document>

次の不完全なスタイルシートを書き留めました

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="awards/award">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
                <!--how can i create a list of all users who have this award-->
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

テンプレート「awards/Awards」に「この賞を受賞したすべてのユーザーをuserというサブ要素として追加し、追加された要素の値をユーザーの名前にする」などのクエリの書き方がわかりません。次の出力が得られます。誰かが私を正しいアプローチに導くことができれば、私は大いに感謝します。

<document>
    <users>
        <user identity="1">
            <name>
                <first>abc</first>
                <last>xyz</last>
            </name>
            <achievements>
                <achievement>Award A</achievement>
                <achievement>Award B</achievement>
            </achievements>
        </user>
        <user identity="2">
            <name>
                <first>123</first>
                <last>DEF</last>
            </name>
            <achievements>
                <received>Award A</received>
            </achievements>
        </user>
        <user identity="3">
            <name>
                <first>aaa</first>
                <last>bbb</last>
            </name>
            <achievements>
                <received>Award B</received>
            </achievements>
        </user>
    </users>
    <!--awards-->
    <awards>
        <award>
            <name>Award A</name>
            <user identity="1">abc xyz</user>
            <user identity="2">123 DEF</user>    
        </award>
        <award>
            <name>Award B</name>
            <user identity="1">abc xyz</user>
            <user identity="3">aaa bbb</user>
        </award>
    </awards>
</document>

前もって感謝します

4

1 に答える 1

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:key name="kUserByAward" match="user"
          use="achievements/*[self::achievement or self::received]"/>

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

 <xsl:template match="award">
   <award>
    <xsl:apply-templates select="node()"/>
    <xsl:apply-templates select="key('kUserByAward', name)" mode="inclusion"/>
   </award>
 </xsl:template>

 <xsl:template match="user" mode="inclusion">
  <user>
    <xsl:copy-of select="name"/>
  </user>
 </xsl:template>
</xsl:stylesheet>

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

<document>
    <users>
        <user>
            <name>
                <first>abc</first>
                <last>xyz</last>
            </name>
            <achievements>
                <achievement>Award A</achievement>
                <achievement>Award B</achievement>
            </achievements>
        </user>
        <user>
            <name>
                <first>dsd</first>
                <last>sdasdsadsa</last>
            </name>
            <achievements>
                <received>Award A</received>
            </achievements>
        </user>
        <user>
            <name>
                <first>aaa</first>
                <last>bbb</last>
            </name>
            <achievements>
                <received>Award B</received>
            </achievements>
        </user>
    </users>
    <!--awards-->
    <awards>
        <award>
            <name>Award A</name>
            <!--here the list of the users who recieved this award has to be included-->
        </award>
        <award>
            <name>Award B</name>
        </award>
    </awards>
</document>

必要な正しい結果を生成します(私が推測するもの) :

<document>
   <users>
      <user>
         <name>
            <first>abc</first>
            <last>xyz</last>
         </name>
         <achievements>
            <achievement>Award A</achievement>
            <achievement>Award B</achievement>
         </achievements>
      </user>
      <user>
         <name>
            <first>dsd</first>
            <last>sdasdsadsa</last>
         </name>
         <achievements>
            <received>Award A</received>
         </achievements>
      </user>
      <user>
         <name>
            <first>aaa</first>
            <last>bbb</last>
         </name>
         <achievements>
            <received>Award B</received>
         </achievements>
      </user>
   </users><!--awards-->
   <awards>
      <award>
         <name>Award A</name><!--here the list of the users who recieved this award has to be included-->
         <user>
            <name>
               <first>abc</first>
               <last>xyz</last>
            </name>
         </user>
         <user>
            <name>
               <first>dsd</first>
               <last>sdasdsadsa</last>
            </name>
         </user>
      </award>
      <award>
         <name>Award B</name>
         <user>
            <name>
               <first>abc</first>
               <last>xyz</last>
            </name>
         </user>
         <user>
            <name>
               <first>aaa</first>
               <last>bbb</last>
            </name>
         </user>
      </award>
   </awards>
</document>

説明:キーの適切な使用とIDルールのオーバーライド。

更新:OPは実際に必要な出力形式を示しています。これは私が推測したものに非常に近いです。唯一の変更は、このテンプレートを使用することであり、最初のソリューションにテンプレートを挿入します。

 <xsl:template match="user" mode="inclusion">
  <user identity="{@identity}">
    <xsl:copy-of select="concat(name/first, ' ', name/last)"/>
  </user>
 </xsl:template>
于 2012-05-28T15:25:33.477 に答える