检查并打印 xslt 中的节点

check and print nodes in 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

我希望能够只打印前两行。或说明 "No Notes" 的消息。但是,我不明白如何精确计算两个或检查是否缺少任何元素。

您可以使用 position() 并且只打印 note 个 position() <=2 :

的元素
 <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;

并且您可以使用 xsl:choose 检查 notes 中是否有任何 note 元素,打印 No Notes 以防有 none 并处理xsl:for-each 循环以防出现:

<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

<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"/>

前两个注释将根据默认模板规则打印,这取决于您希望它们的格式。

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