XSLT正确使用child :: *,在这种情况下使用xsl:for-each和xsl:template之间的区别

时间:2014-01-29 19:48:19

标签: xslt xslt-1.0

我尝试为以下格式的输入xml创建XSL转换。

同时使用<xsl:for-each /><xsl:template />

XML 1:

<books>
    <book>
        <title>charithram</title>
        <author>sarika</author>
    </book>
    <book>
        <title>doublebell</title>
        <author>psudarsanan</author>
    </book>
</books>

XSLT 1:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <table border="1">
      <tr>
        <th>Title</th>
        <th>Author</th>
      </tr>
      <xsl:for-each select="books/book">
      <tr>
        <td><xsl:value-of select="title" /></td>
        <td><xsl:value-of select="author" /></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

或者

XSLT 2:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <table border="1">
      <tr>
        <th>Title</th>
        <th>Author</th>
      </tr>
      <xsl:apply-templates/>
    </table>
  </body>
  </html>
</xsl:template>

<xsl:template match="books/book">
      <tr>
        <td><xsl:value-of select="title" /></td>
        <td><xsl:value-of select="author" /></td>
      </tr>
</xsl:template>

</xsl:stylesheet

...

现在,如果XML是

XML 2:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book.child.1>
        <title>charithram</title>
        <author>sarika</author>
    </book.child.1>
    <book.child.2>
        <title>doublebell</title>
        <author>psudarsanan</author>
    </book.child.2>
</books>

我可以使用books/child::*

来完成结果

XSLT 3:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <table border="1">
      <tr>
        <th>Title</th>
        <th>Author</th>
      </tr>
      <xsl:for-each select="books/child::*">
      <tr>
        <td><xsl:value-of select="title" /></td>
        <td><xsl:value-of select="author" /></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

问题:

  1. 在上述方案中使用<xsl:for-each/>和应用模板有什么区别?我没有看到任何区别。 [ XSLT 1和XSLT 2 ]

  2. 请验证这是否正确。 [使用<xsl:for-each select="books/child::*">完成结果] [ XSLT 3 ]

  3. 更新: 我已经删除了我的第三个问题,并将在另一个帖子中发布。

1 个答案:

答案 0 :(得分:1)

1)事实上,你是对的。 xsl:for-each是一种“匿名内联模板”。在许多情况下,它实际上是不好的做法,因为它往往表明样式表是在程序上而不是由规则驱动的......但它有时是表达逻辑的最佳方式。与大多数编程语言一样,解决大多数问题的方法不止一种,程序员需要培养一种风格来挑选最好的问题。

2)正如Ian Roberts所说,“是的,那会有效,但书籍/孩子:: *可以缩短为书籍/ *,因为孩子::是默认轴”。 (他确实值得回答那个问题 - 我半睡半醒而且没有获得Round Tuit。)