XSLT:许多具有相同名称的标记的解决方案

时间:2015-12-29 06:43:08

标签: xslt

我有一个XML文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
    <fruits>
        <fruit>
            <title>Orange</title>
            <description> This is orange</description>
        </fruit>
        <fruit>
            <title>Apple</title>
            <description>This is apple</description>
        </fruit>
    </fruits>
</document>

如果我想要怎么办? 如果title =“Orange” - &gt;

<P name="Orange">true</P> 

其他

<P name="Orange">false</P>. 

与Apple类似。 我的解决方案是:

<xsl:for-each select="document/fruits/fruit">
    <xsl:choose>
        <xsl:when test="title='Orange'">
            <P name="Orange">true</P>
        </xsl:when>
        <xsl:otherwise>
            <P name="Orange">false</P>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:choose>
        <xsl:when test="title='Apple'">
            <P name="Apple">true</P>
        </xsl:when>
        <xsl:otherwise>
            <P name="Apple">false</P>
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

但我收到了:

<P name="Orange">true</P>
<P name="Apple">false</P>
<P name="Orange">false</P>
<P name="Apple">true</P>

这是重复的两个。有谁知道怎么做?

1 个答案:

答案 0 :(得分:0)

如评论中所述,您正在重复每个水果的测试,因此您可以为每个水果获得单独的结果。

如果要测试所有 fruit节点中是否存在(至少一个)Orange,请使用以下内容:

<xsl:template match="/">
    <result>
        <xsl:choose>
            <xsl:when test="document/fruits/fruit/title='Orange'">
                <P name="Orange">true</P>
            </xsl:when>
            <xsl:otherwise>
                <P name="Orange">false</P>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
            <xsl:when test="document/fruits/fruit/title='Apple'">
                <P name="Apple">true</P>
            </xsl:when>
            <xsl:otherwise>
                <P name="Apple">false</P>
            </xsl:otherwise>
        </xsl:choose>
    </result>
</xsl:template>

或者很快:

<xsl:template match="/">
    <xsl:variable name="fruit" select="document/fruits/fruit" />
    <result>
        <P name="Orange">
            <xsl:value-of select="$fruit/title='Orange'"/>
        </P>
        <P name="Apple">
            <xsl:value-of select="$fruit/title='Apple'"/>
        </P>
    </result>
</xsl:template>