XPath:属性比较

时间:2016-09-15 02:35:17

标签: xml xpath xslt-1.0 xpathnavigator

我正在寻找框架xpath逻辑的解决方案来比较属性。

<menucontainer id="menu1" op="o3" indicator="highlight">
<menubox>
<menutitle>TITLE</menutitle>
<menuoptionlist>
<menuoption id="o1">Select a path from below :</menuoption>
<menuoption id="o2">IMAGE1</menuoption>
<menuoption id="o3">IMAGE2</menuoption>
<menuoption id="o4">IMAGE3</menuoption>
<menuoption id="o5">IMAGE4</menuoption>
<menuoption id="o6">IMAGE5</menuoption>
</menuoptionlist>
</menubox>
</menucontainer>

这里我想比较menucontainers op值(op =&#34; 03&#34;)和menuoption ids.So这里理想的匹配将是IMAGE2。我会用红色突出显示IMAGE2。

我尝试了//menublock/menucontainer/@op = //menublock/menucontainer/menuoptionlist/menuoption/@id

但它不是动态的。它检查第一个结果并在所有地方应用相同的结果。帮助构建xpath。

2 个答案:

答案 0 :(得分:0)

要返回值为IMAGE2的节点menuoption,基于menuoption属性id等于menucontainer属性op,您可以使用以下XPath选择器 //menucontainer/menubox/menuoptionlist/menuoption[@id=../../../@op]

../上升了一个级别。 W3schools XPath Syntax

XPathFiddle

答案 1 :(得分:0)

借助我的水晶球,我为您提供了解决方案。

XPATH //menuoption[@id = ancestor::menucontainer/@op] [您可以根据需要限制//menuoption。]

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml"/>

    <xsl:template match="menuoption[@id = ancestor::menucontainer/@op]">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <!-- add a specific attribute -->
            <xsl:attribute name="highlight">
                <xsl:text>red</xsl:text>
            </xsl:attribute>
            <xsl:apply-templates />
        </xsl:copy>        
    </xsl:template>

    <!-- identity copy -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

将属性highlight更改为您想要的任何内容。在您的环境中安装这些模板。 [水晶球破裂]