比较前面的文本并获得输出

时间:2015-03-24 07:33:11

标签: xslt xslt-2.0

我是以下的XML。

    <?xml version="1.0" encoding="UTF-8"?>
<body>
  <para>
      <phrase>[1.001]</phrase> Arrest is for the pu</para>
    <para>
      <phrase>[1.002]</phrase> Brandon J said in 
    </para>
    <para>
      <phrase>[1.001]</phrase> Singapore used to be and is still
    </para>
</body>

以及下面的XSL。

        <xsl:template name="para" match="para">
        <xsl:apply-templates select="./node()[1][self::page]" mode="first"/>
        <div>
            <xsl:choose>
                <xsl:when test="./@align">
                    <xsl:attribute name="class"><xsl:text>para align-</xsl:text><xsl:value-of select="./@align"/></xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:attribute name="class"><xsl:text>para</xsl:text></xsl:attribute>
                </xsl:otherwise>
            </xsl:choose>

            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match="phrase">
       <xsl:choose>
                    <xsl:when test="contains(preceding::phrase,.)">
                <xsl:text>Duplicate </xsl:text>
                <xsl:value-of select ="."/>
                    </xsl:when>
                    <xsl:otherwise>
<xsl:text>Non Duplicate </xsl:text>
                <xsl:value-of select ="."/>             
                    </xsl:otherwise>
                </xsl:choose>

    </xsl:template>

我尝试将phrase与前面phrase中的任何一个匹配,如果匹配,我想打印Duplicate //phrase value,否则non duplicate \\phrase value。但是当我尝试运行这些时,它会在第三种情况下向我抛出以下错误。

 XPTY0004: A sequence of more than one item is not allowed as the first argument of
  contains() ("[1.001]", "[1.002]") 

此处由于前一个短语中有[1.001],我希望它能够打印Duplicate [1.001]

请让我知道我哪里出错了以及如何解决。

这是working DEmo

由于

1 个答案:

答案 0 :(得分:1)

如果您想要检查前面的contains(preceding::phrase[1],.)是否包含当前值,请检查phrase是否要检查前一个preceding::phrase[contains(., current())]phrase。< / p>