我需要检查具有特定属性的节点是否是循环中的最后一个,并相应地在最后一个节点之前插入和&符号。我尝试使用
<xsl:if test="position() = last()">
似乎没有考虑属性值。
这是XML
<creators and-others="no">
<creator type="personal">Roche, R.L.</creator>
<creator type="personal">Moulin, D.</creator>
<creator type="personal">James, K.</creator>
<creator type="affiliation">CEA Centre d'Etudes Nucleaires de Saclay, 91 - Gif-sur- zYvette (France). Dept. d'Etudes Mecaniques et Thermiques</creator>
</creators>
我需要输出为Roche, R.L., Moulin, D., & James, K.
另外,有没有办法获得“创建者”节点的值计数,属性为“个人”?
答案 0 :(得分:1)
您可以尝试迭代<xsl:for-each select="creator[@type='personal']">
并在那里使用<xsl:if>
。 XPath应选择所有这些元素,其属性type
的值为personal
。
您可以在count
函数中使用类似的表达式。
答案 1 :(得分:1)
为什么不计算匹配模板中的followng兄弟? 之后的最后一个计数creator[@type='personal']
节点将为零。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="text"/>
<xsl:template match="/creators">
<xsl:apply-templates select="creator"/>
</xsl:template>
<xsl:template match="creator[@type='personal']">
<xsl:choose>
<xsl:when test="count(following-sibling::creator[@type='personal'])=0">
<xsl:text>& </xsl:text><xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/><xsl:text>, </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="creator"/>
</xsl:stylesheet>
应用于您的输入,生成:
Roche, R.L., Moulin, D., & James, K.
根据模板上下文,您始终可以使用axis来获取节点的计数。例如:
<xsl:template match="/creators">
<xsl:variable name="count" select="count(child::creator[@type='personal'])"/>
</xsl:template>
会将$count
设置为3
。
答案 2 :(得分:0)
这应该有效
<xsl:if test="count(//creator[@type='personal']) > 0">
Found personal
</xsl:if>
如果您想将其存储在变量
中<xsl:variable name="PersonalCount" select="count(//creator[@type='personal'])"></xsl:variable>
答案 3 :(得分:0)
使用谓词[@type='personal']
仅选择所需的<creator>
元素。然后你的测试条件不使用任何计数或引用兄弟元素。您还应该测试是否只有一个<creator type="personal">
,否则您最终会输出额外的&
或逗号。因此,<xsl:choose>
比<xsl:if>
更容易。
以下示例代码。如果您想在现有模板中执行此操作,也可以使用<xsl:for-each select="creator[@type='personal']">
代替creator
的单独模板并调用<xsl:apply-templates select="creator[@type='personal']"/>
。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="creators">
<xsl:apply-templates select="creator[@type='personal']"/>
</xsl:template>
<xsl:template match="creator">
<xsl:choose>
<xsl:when test="position() = 1">
</xsl:when>
<xsl:when test="position() = last()">
<xsl:text> & </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>, </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
给定输入
<creators and-others="no">
<creator type="personal">Roche, R.L.</creator>
<creator type="personal">Moulin, D.</creator>
<creator type="personal">James, K.</creator>
<creator type="affiliation">CEA Centre d'Etudes Nucleaires de Saclay, 91 - Gif-sur- zYvette (France). Dept. d'Etudes Mecaniques et Thermiques</creator>
</creators>
它产生以下输出
Roche, R.L., Moulin, D. & James, K.
答案 4 :(得分:0)
这是一个较短的解决方案,根本不使用任何XSLT条件指令:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:apply-templates select="creator[@type='personal']"/>
</xsl:template>
<xsl:template match=
"creator[@type='personal'][position()>1 and not(position()=last())]">
<xsl:text>, </xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="creator[@type='personal'][position()=last()]">
<xsl:text>, & </xsl:text>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<creators and-others="no">
<creator type="personal">Roche, R.L.</creator>
<creator type="personal">Moulin, D.</creator>
<creator type="personal">James, K.</creator>
<creator type="affiliation">CEA Centre d'Etudes Nucleaires de Saclay, 91 - Gif-sur- zYvette (France). Dept. d'Etudes Mecaniques et Thermiques</creator>
</creators>
产生了想要的正确结果:
Roche, R.L., Moulin, D., & James, K.
此外,有没有办法,以获得计数 “创建者”节点的值,用 属性“个人”?
使用强>:
count(/*/creator[@type='personal'])
<强>解释强>:
使用模式匹配代替XSLT条件指令。
使用XSLT(默认)处理模型和内置模板。