在条件之前从某些元素获取项目的值

时间:2012-07-18 11:51:09

标签: xml xslt

我有这样的XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="do.xsl"?>
<catalog>
  <cd>
    <title_>Empire Burlesque</title_>
    <artist>Bobby</artist>
    <company>Columbia</company>
  </cd>
  <cd>
    <title_>Shirt2</title_>
    <artist>Bobby</artist>
    <company>Columbia2</company>
  </cd>
  <cd>
    <title_>Fingers</title_>
    <artist>Bobby</artist>
    <company>Columbia3</company>
  </cd>
  <cd>
    <title_>Zip1</title_>
    <artist>Bobby</artist>
    <company>---</company>
  </cd>
  <cd>
    <title_>Zip2</title_>
    <artist>Bobby</artist>
    <company>---</company>
  </cd>
</catalog>

我需要用之前有意义的数据替换--- Columbia3 我接下来做

<?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" version="4.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title_"/></td>
      <td><xsl:value-of select="artist"/></td>
      <td>
          <xsl:variable name="NotStarted" select="preceding-sibling::cd[1]/company" />
          <xsl:choose>
            <xsl:when test="company != '---'">
              <xsl:value-of select="company"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:copy-of select="$NotStarted" />
            </xsl:otherwise>
          </xsl:choose>
      </td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet> 

正如预期的那样,我得到了下一个HTML

Title   Artist
Empire Burlesque    Bobby   Columbia
Shirt2  Bobby   Columbia2
Fingers Bobby   Columbia3
Zip1    Bobby   Columbia3
Zip2    Bobby   ---

我如何迭代以获取最后一个有意义的字符串以替换或以任何其他方式?感谢。

1 个答案:

答案 0 :(得分:1)

这可以通过更改 NotStarted 变量

来实现
<xsl:variable name="NotStarted" select="preceding-sibling::cd[1]/company" />

目前正在做的是找到前一个兄弟,无论内容如何,​​以及获取公司元素。您需要做的是找到具有有效公司名称的第一个兄弟姐妹

<xsl:variable name="NotStarted" 
   select="preceding-sibling::cd[company != '---'][1]/company/text()"/>

值得注意的是,通常最好避免在XSLT中使用 xsl:for-each xsl:choose ,并尝试利用模板匹配。这是一个演示此

的备用XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" version="4.0" encoding="utf-8" indent="yes"/>

   <xsl:template match="/">
      <html>
         <body>
            <h2>My CD Collection</h2>
            <table border="1">
               <tr bgcolor="#9acd32">
                  <th>Title</th>
                  <th>Artist</th>
               </tr>
               <xsl:apply-templates select="catalog/cd"/>
            </table>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="cd">
      <tr>
         <td>
            <xsl:value-of select="title_"/>
         </td>
         <td>
            <xsl:value-of select="artist"/>
         </td>
         <td>
            <xsl:apply-templates select="company"/>
         </td>
      </tr>
   </xsl:template>

   <xsl:template match="company[text() = '---']">
      <xsl:value-of select="../preceding-sibling::cd[company != '---'][1]/company"/>
   </xsl:template>
</xsl:stylesheet>

应用于XML示例时,输出以下内容

<html>
   <body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
         </tr>
         <tr>
            <td>Empire Burlesque</td>
            <td>Bobby</td>
            <td>Columbia</td>
         </tr>
         <tr>
            <td>Shirt2</td>
            <td>Bobby</td>
            <td>Columbia2</td>
         </tr>
         <tr>
            <td>Fingers</td>
            <td>Bobby</td>
            <td>Columbia3</td>
         </tr>
         <tr>
            <td>Zip1</td>
            <td>Bobby</td>
            <td>Columbia3</td>
         </tr>
         <tr>
            <td>Zip2</td>
            <td>Bobby</td>
            <td>Columbia3</td>
         </tr>
      </table>
   </body>
</html>