2

次の値を持つ辞書があります。

<root
    user_salutation="Geachte heer"
    wg="7"
    wgList-0="68"
    wgListCount-0="3"
    wgList-1="65"
    wgListCount-1="1"
    wgList-2="62" 
    wgListCount-2="1"
    wgList-3="58"
    wgListCount-3="2"
/>

foreach でリストとカウントをリンクするにはどうすればよいですか?

 <?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" indent="yes" omit-xml-declaration ="yes" encoding="ISO-8859 1"/>

 <xsl:variable name="style">
  body {
  font-family: verdana;
  font-size: 11px;
  }
  td {
  height: 15px;
  border: 0px;
  font-family: verdana;
  font-size: 11px;
  }
  th {
  background-color: #999999;
  color: white;
  font-family: verdana;
  font-size: 11px;
  }
  </xsl:variable>

  <xsl:variable name="prijs_zichtbaar"> 1 </xsl:variable>

  <xsl:key name="params" match="tag[@name!='param']" use="generate-id(preceding-    sibling::tag[@name='param'][1])" />

  <xsl:template match="tag[@name='param']">
  <xsl:text>param&#10;</xsl:text>
  <xsl:apply-templates select="key('params', generate-id())" />
</xsl:template>

<xsl:template match="tag">
 <xsl:value-of select="concat(' - ', @name, '&#10;')" />
</xsl:template>

<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>wgp</title>
    <style>
      <xsl:value-of select="$style"/>
    </style>
  </head>
  <body>
        <table cellpadding="3" cellspacing="0" border="0" width="" >
            <colgroup>
                <col width="200"/>
                <col width="100"/>
                <col width="100"/>
                <col width="100"/>
            </colgroup>

            <tr>
                <th align="left">Soort</th>
                <th align="right">Dag</th>
                <th align="right">Aantal</th>
                <th align="right">Ontvangers</th>
            </tr>

            <xsl:for-each select="root/@*[starts-with(name(),'wgList-')]">
               <xsl:element name="TR">
                 <xsl:if test="position() mod 2 = 0">
                    <xsl:attribute name="bgcolor">#CCCCCC</xsl:attribute>
                 </xsl:if>

                 <td align="left">wg</td>
                 <td align="right"><xsl:value-of select="."/></td>
                 <td align="right"><xsl:value-of select="@*[name() = concat('wgListCount-', substring-after(name(current()), '-'))]" /></td>
               </xsl:element>
            </xsl:for-each>

            <xsl:if test="root/@list1 > 0">
                <xsl:element name="TR">
                    <td align="left"><b>subtotaal:</b></td>
                    td align="left"></td>
                    <td align="right">----------------<br/><xsl:value-of select="root/@wg" /></td>
                    <td align="right">----------------<br/><xsl:value-of-select="root/@wg" /></td>
                </xsl:element>
            </xsl:if>

                </td>
            </tr>
        </table>
    </body>
  </html>
</xsl:template>
</xsl:stylesheet>
4

1 に答える 1

2

ここで推測していますが、XSLT スニペットを見ると、キーと値がルート要素の属性であることが示唆されます。

<root
   wgList-0="68"
   wgListCount-0="3"
   wgList-1="65"
   wgListCount-1="4"
   wgList-2="62"
   wgListCount-2="8">
</root>

この場合、キー値を取得するために必要な XSLT は次のとおりです。

<xsl:value-of 
   select="../@*
     [name() = concat('wgListCount-', substring-after(name(current()), '-'))]"/>

これが行っているのは、現在の属性の名前のハイフンの後にある部分 (つまり、0、1、または 2) を取得し、この値を使用して予想されるwgListCount要素の名前を取得することです。これは、現在wgList-要素に配置されていることを前提としています。

XSLT のサンプルを次に示します (コードを短くして問題に集中するために、一部のコードを削除しました)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes" omit-xml-declaration="yes" encoding="ISO-8859 1"/>

   <xsl:template match="/">
      <html xmlns="http://www.w3.org/1999/xhtml">
         <head>
            <title>wgp</title>
         </head>
         <body>
            <table cellpadding="3" cellspacing="0" border="0" width="">
               <tr>
                  <th align="left">Soort</th>
                  <th align="right">Dag</th>
                  <th align="right">Aantal</th>
                  <th align="right">Ontvangers</th>
               </tr>
               <xsl:for-each select="root/@*[starts-with(name(),'wgList-')]">
                  <xsl:element name="TR">
                     <td align="left">wg</td>
                     <td align="right">
                        <xsl:value-of select="."/>
                     </td>
                     <td align="right">
                        <xsl:value-of select="../@*[name() = concat('wgListCount-', substring-after(name(current()), '-'))]"/>
                     </td>
                  </xsl:element>
               </xsl:for-each>
            </table>
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

上記の XML に適用すると、次のように出力されます。

<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <title>wgp</title>
   </head>
   <body>
      <table cellpadding="3" cellspacing="0" border="0" width="">
         <tr>
            <th align="left">Soort</th>
            <th align="right">Dag</th>
            <th align="right">Aantal</th>
            <th align="right">Ontvangers</th>
         </tr>
         <TR>
            <td align="left">wg</td>
            <td align="right">68</td>
            <td align="right">3</td>
         </TR>
         <TR>
            <td align="left">wg</td>
            <td align="right">65</td>
            <td align="right">1</td>
         </TR>
         <TR>
            <td align="left">wg</td>
            <td align="right">62</td>
            <td align="right">1</td>
         </TR>
         <TR>
            <td align="left">wg</td>
            <td align="right">58</td>
            <td align="right">2</td>
         </TR>
      </table>
   </body>
</html>
于 2012-11-14T15:30:10.850 に答える