检查并打印xslt中的节点

时间:2015-01-20 20:21:16

标签: xml xslt

部分XML

<Notes>
<Note>Line 1</Note>
<Note>Line 2</Note>
<Note>Line 2</Note>
</Notes>

部分XSLT

<xsl:for-each select="/Notes/Note">
<xsl:value-of select=".">
</xsl:value-of>
</xsl:for-each>

输出:

Line 1
Line 2
Line 3

我希望能够只打印前两行。或者是一条消息,说明&#34;没有备注&#34;。但是,我不明白如何计算两个或检查缺少任何元素。

2 个答案:

答案 0 :(得分:0)

您可以使用position()并仅使用位置()&lt; = 2打印note元素:

 <xsl:for-each select="/Notes/Note[position() &lt;= 2]">
   <xsl:value-of select=".">
   </xsl:value-of>
 </xsl:for-each>

结果:

Line 1
Line 2

请注意,<必须在select语句中以&lt;进行转义。

您可以使用note检查notes内是否有xsl:choose个元素,如果没有,则打印No Notes并处理xsl:for-each looop万一有:

<xsl:choose>
    <xsl:when test="/Notes/Note">
        <xsl:for-each select="/Notes/Note[position() &lt;= 2]">
          <xsl:value-of select="."/>
        </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>No Notes</xsl:otherwise>
</xsl:choose>

供参考:https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/position

答案 1 :(得分:0)

<xsl:template match="Notes[not(*)]">
  <xsl:text>No Notes</xsl:text>
</xsl:template>

<!-- ignore everything after the second note -->
<xsl:template match="Note[2]/following-sibling::Note"/>

前两个音符将按默认模板规则打印,具体取决于您希望它们的格式化方式。

同样,带有子Notes的Notes将由内置规则处理。