2017-04-11 5 views
0

特定の順序で属性を取得する必要があるため、特定の一連の名前に対してループを使用しています。 @ $属性や@のようなものをしたい。ただ使用しています。私は自分の名前を与えてくれるのであって、私が欲しい属性の価値ではありません。変数を属性名として使用する

基本的に、各行に「タイトル」と「アーティスト」と言うのではなく、実際のタイトルとアーティストが必要です。

hello.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<results> 
    <r title="Empire Burlesque" artist="Bob Dylan" /> 
    <r title="Hide your heart" artist="Bonnie Tyler" /> 
    <r title="Greatest Hits" artist="Dolly Parton" /> 
</results> 

hello.xsl:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template name="boxNames"> <!-- not used as template --> 
    <name>title</name> 
    <name>artist</name> 
</xsl:template> 
<xsl:template match="/"> 
<xsl:variable name="boxNames" select="document('')/xsl:stylesheet/xsl:template[@name='boxNames']/name" /> 
<html> 
<body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
    <tr bgcolor="#9acd32"> 
     <xsl:for-each select="$boxNames"> 
     <th style="text-align:left"><xsl:value-of select="." /></th> 
     </xsl:for-each> 
    </tr> 
    <xsl:for-each select="results/r"> 
    <tr> 
     <xsl:for-each select="$boxNames"> 
     <td><xsl:value-of select="."/></td> 
     </xsl:for-each> 
    </tr> 
    </xsl:for-each> 
    </table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

出力:あなたは、単にの順番をハードコーディングすることはできませんなぜ

<html> 
    <body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
      <th style="text-align:left">title</th> 
      <th style="text-align:left">artist</th> 
     </tr> 
     <tr> 
      <td>title</td> 
      <td>artist</td> 
     </tr> 
     <tr> 
      <td>title</td> 
      <td>artist</td> 
     </tr> 
     <tr> 
      <td>title</td> 
      <td>artist</td> 
     </tr> 
     </table> 
    </body> 
</html>Execution time: 88.941623ms 

答えて

0

私が表示されませんスタイルシート自体に含める列は次のとおりです。

XSLT 1.0

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

<xsl:template match="/results"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <table border="1"> 
       <!-- header --> 
       <tr> 
        <th>title</th> 
        <th>artist</th> 
       </tr> 
       <!-- body --> 
       <xsl:for-each select="r"> 
        <tr> 
         <td> 
          <xsl:value-of select="@title"/> 
         </td> 
         <td> 
          <xsl:value-of select="@artist"/> 
         </td> 
        </tr> 

       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

しかし、あなたが本当に別のリスト内の列名を列挙したい場合は、この方法でそれを試してみてください。

XSLT 1.0

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

<xsl:variable name="columns"> 
    <name>title</name> 
    <name>artist</name> 
</xsl:variable> 

<xsl:variable name="column-names" select="document('')/*/xsl:variable[@name='columns']/name" /> 

<xsl:template match="/results"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <table border="1"> 
       <!-- header --> 
       <tr> 
        <xsl:for-each select="$column-names"> 
         <th> 
          <xsl:value-of select="." /> 
         </th> 
        </xsl:for-each> 
       </tr> 
       <!-- body --> 
       <xsl:for-each select="r"> 
        <xsl:variable name="row" select="."/> 
        <tr> 
         <xsl:for-each select="$column-names"> 
          <td> 
           <xsl:value-of select="$row/@*[name()=current()]"/> 
          </td> 
         </xsl:for-each> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 
関連する問題