检查先前在XSLT中是否具有特定类型/值

时间:2013-12-19 06:32:10

标签: xml xslt xpath

我有类似以下的XML

    <ARTICLE type="newspaper" segment="entertainment">
    <Price type="tax">$2</Price>
    </ARTICLE>
    <ARTICLE type="newspaper" segment="political">
    <Price type="tax">$1</Price>
    </ARTICLE>

现在我要做的是只在前面的top元素是ARTICLE并且segment =“entertainment”

时才删除Price(块)

我尝试了以下方法,但它删除了两个块

<xsl:template match="Price[@type='tax'] ">
<xsl:if test="preceding::ARTICLE[1]/attribute(segment)='entertainment'">
    <xsl:apply-templates/>
    </xsl:if>
    </xsl:template>

需要帮助。我必须删除价格区块,只有当区段是“娱乐”时才会立即进入上层文章。

3 个答案:

答案 0 :(得分:0)

很难说出为什么你的模板在没有更多上下文的情况下工作(如格式良好的示例XML)。

这应该可行:

<xsl:template match="Price[@type='tax' and parent::ARTICLE[@segment='entertainment']]"/>

如果您仍想要Price的文字,请添加xsl:apply-templates

<xsl:template match="Price[@type='tax' and parent::ARTICLE[@segment='entertainment']]">
    <xsl:apply-templates/>
</xsl:template> 

答案 1 :(得分:0)

你可以试试这个:

  <xsl:template match="Price[@type='tax'] ">
    <xsl:if test="preceding-sibling::ARTICLE[1]/attribute(segment)='entertainment'">
        <xsl:apply-templates/>
        </xsl:if>
        </xsl:template>

希望有所帮助......

答案 2 :(得分:0)

只需使用模板:

<xsl:template match="ARTICLE[@segment='entertainment']/Price" />

这与您正在寻找的price元素完全匹配,并且不会输出任何内容。