0

我需要找到所有的书,如果这本书有不止一个作者,写第一作者的名字和那个名字后面的“et al”。下面是我的代码和第一本书用“JK Rowling et al”打印,但它不起作用为第二本书。

这是xml代码

 <bookstore>
 <book>
 <title category="fiction">Harry Potter</title>
 <author>J. K. Rowling</author>
<author>sxdgfds</author>
<publisher>Bloomsbury</publisher>
 <year>2005</year>
 <price>29.99</price>
 </book>
 <book>
 <title category="fiction">The Vampire Diaries</title>
 <author>L.J. Smith</author>
 <author>sdgsdgsdgdsg</author>
<publisher>Bloomsbury</publisher>
 <year>2004</year>
 <price>25.99</price>
 </book>
 <book>
 <title category="fiction">The DaVinci Code</title>
 <author>Dan Brown</author>
<publisher>Bloomsbury</publisher>
 <year>2002</year>
 <price>35.99</price>
 </book>

这是 xslt 代码

 <xsl:for-each select="//book[30 >price]">

    <xsl:if test="title[@category='fiction']">

             <span style="color:blue;font-weight:bold"><xsl:value-of select="title"/></span><br />
             <xsl:choose>
                <xsl:when test="count(./author)>1">
                    <span style="color:red;font-style:italic"><xsl:value-of select="author"/></span>
                    <span style="color:red;font-style:italic"> et al</span><br />
                </xsl:when>
                <xsl:otherwise>
                    <span style="color:red;font-style:italic"><xsl:value-of select="author"/></span><br />
                </xsl:otherwise>
            </xsl:choose>
             <span><xsl:value-of select="price"/></span><br />

    </xsl:if>

  </xsl:for-each>

我试图计算有多少作者,但似乎我对计数函数的路径有问题。任何帮助将不胜感激。

4

1 回答 1

1

您的代码似乎还可以,但同样的事情可以更简单地表达。

<xsl:for-each select="//book[price &lt; 30]">
    <xsl:if test="title[@category='fiction']">
        <span style="color:blue;font-weight:bold"><xsl:value-of select="title"/></span><br />
        <span style="color:red;font-style:italic"><xsl:value-of select="author[1]" /></span>
        <xsl:if test="author[2]">
            <span style="color:red;font-style:italic"> et al</span>
        </xsl:if>
        <br />
        <span><xsl:value-of select="price"/></span><br />
    </xsl:if>
</xsl:for-each>

上面的代码比你的代码短,但它不是很优雅。这个更好。

<xsl:template match="/">
  <xsl:apply-templates select="//book[price &lt; 30 and @category='fiction']" />
</xsl:template>

<xsl:template match="book">
  <div class="book">
    <div class="title"><xsl:value-of select="title"/></div>
    <div class="author">
      <xsl:value-of select="author[1]" /><xsl:if test="author[2]"> et al</xsl:if>
    </div>
    <div class="price"><xsl:value-of select="price"/></div>
  </div>
</xsl:template>
  • 编写可以显示每一本书的通用模板,比如这本书。
  • 使用它们 via<xsl:apply-templates>而不是重复使用<xsl:for-each>.
  • 使用 CSS 设置输出样式。内联样式很难看。
于 2013-10-20T06:17:42.693 回答