XSLT属性中的最后位置

时间:2011-05-31 10:45:06

标签: xslt string-formatting

我需要检查具有特定属性的节点是否是循环中的最后一个,并相应地在最后一个节点之前插入和&符号。我尝试使用

<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.

另外,有没有办法获得“创建者”节点的值计数,属性为“个人”?

5 个答案:

答案 0 :(得分:1)

您可以尝试迭代<xsl:for-each select="creator[@type='personal']">并在那里使用<xsl:if>。 XPath应选择所有这些元素,其属性type的值为personal

您可以在count函数中使用类似的表达式。

答案 1 :(得分:1)

为什么不计算匹配模板中的followng兄弟? 之后的最后一个计数creator[@type='personal']节点将为零。

XSLT 2.0 Saxon-HE 9.2.1.1J 下进行了测试(在 MSXSL 4.0上 XSLT 1.0 >)

<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>&amp; </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']) &gt; 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> &amp; </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>, &amp; </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'])

<强>解释

  1. 使用模式匹配代替XSLT条件指令。

  2. 使用XSLT(默认)处理模型和内置模板。