0

現在のXMLは次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Dolly Parton</artist>
        <country>USA</country>
        <company>RCA</company>
        <price>9.90</price>
        <year>1982</year>
    </cd>
    <cd>
        <title>Still got the blues</title>
        <artist>Gary Moore</artist>
        <country>UK</country>
        <company>Virgin records</company>
        <price>10.20</price>
        <year>1990</year>
    </cd>
</catalog>

現在のXSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <html>
      <body>
        <table border="1">
          <xsl:variable name="a" select="count(catalog/cd[contains(title,'Empire Burlesque')])"/>
          <xsl:for-each select="catalog/cd">
            <tr>
              <td>
                <xsl:choose>
                  <xsl:when test="$a = '2' and contains(title,'Empire Burlesque') ">
                    <xsl:text>pass</xsl:text>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:value-of select="title"/>
                  </xsl:otherwise>
                </xsl:choose>
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

これから:

pass
Hide your heart
pass
Still got the blues

期待される出力:

Empire Burlesque
Hide your heart
pass
Still got the blues

「エンパイアバーレスク」を繰り返さないでください。代わりに、2回目に「パス」に置き換える必要があります。誰かが私が間違っていたに違いないところを助けてくれませんか?

4

2 に答える 2

0

XSLT 1 でグループ化または重複除去を行う場合は、キーを使用した "Muenchian Grouping" 手法に注意する必要があります。

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

<xsl:key name="t" match="title" use="."/>

  <xsl:template match="/">
    <html>
      <body>
        <table border="1">
          <xsl:for-each select="catalog/cd">
            <tr>
              <td>
                <xsl:choose>
                  <xsl:when test="generate-id(title)=generate-id(key('t',title))[1]">
                    <xsl:value-of select="title"/>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:text>pass</xsl:text>
                  </xsl:otherwise>
                </xsl:choose>
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

プロデュース

<html>
   <body>
      <table border="1">
         <tr>
            <td>Empire Burlesque</td>
         </tr>
         <tr>
            <td>Hide your heart</td>
         </tr>
         <tr>
            <td>pass</td>
         </tr>
         <tr>
            <td>Still got the blues</td>
         </tr>
      </table>
   </body>
</html>
于 2013-02-22T15:10:25.883 に答える
0

1 つのオプションを次に示します。

スタイルシート

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

  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates select="catalog"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="catalog">
    <table border="1">
      <xsl:apply-templates select="cd"/>
    </table>
  </xsl:template>

  <xsl:template match="cd">
    <tr>
      <xsl:apply-templates select="title"/>
    </tr>
  </xsl:template>

  <xsl:template match="title">
    <td>
      <xsl:value-of select="."/>
    </td>
  </xsl:template>

  <!--
  Match <title> elements that contain the string "Empire Burlesque" with a
  preceding element like it. This template will be applied rather than the
  one above because it has a higher specificity (as in, it is more specific
  about what kind of node it's looking for).
  -->
  <xsl:template match="title[contains(., 'Empire Burlesque') and
                       preceding::title[contains(., 'Empire Burlesque')]]">
    <td>pass</td>
  </xsl:template>
</xsl:stylesheet>

入力

<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Dolly Parton</artist>
        <country>USA</country>
        <company>RCA</company>
        <price>9.90</price>
        <year>1982</year>
    </cd>
    <cd>
        <title>Still got the blues</title>
        <artist>Gary Moore</artist>
        <country>UK</country>
        <company>Virgin records</company>
        <price>10.20</price>
        <year>1990</year>
    </cd>
</catalog>

出力

<html>
  <body>
    <table border="1">
      <tr>
        <td>Empire Burlesque</td>
      </tr>
      <tr>
        <td>Hide your heart</td>
      </tr>
      <tr>
        <td>pass</td>
      </tr>
      <tr>
        <td>Still got the blues</td>
      </tr>
    </table>
  </body>
</html>

また、できれば避け<xsl:for-each><xsl:apply-templates>て代わりに使用し、コードをきれいで読みやすいチャンクに分割することをお勧めします。

于 2013-02-22T14:32:10.837 に答える