使用xpath选择具有一组多个属性/值的元素

时间:2011-07-16 15:26:16

标签: xml xslt xpath

我有一个XML文档,我需要删除特定的数据

xml文档的结构如下: -

<a>
   <b select='yes please'>
       <c d='text1' e='text11'/>
       <c d='text2' e='text12'/>
       <c d='text3' e='text13'/>
       <c d='text4' e='text14'/>
       <c d='text5' e='text15'/>
   </b>
 </a>
<a>
   <b select='no thanks'>
       <c d='text1' e='text21'/>
       <c d='text3' e='text23'/>
       <c d='text5' e='text25'/>
   </b>
 </a>
<a>
   <b select='yes please'>
       <c d='text1' e='text31'/>
       <c d='text2' e='text32'/>
       <c d='text3' e='text33'/>
       <c d='text4' e='text34'/>
       <c d='text5' e='text35'/>
   </b>
 </a>
<a>
   <b select='no thanks'>
       <c d='text4' e='text41'/>
       <c d='text3' e='text43'/>
       <c d='text5' e='text45'/>
   </b>
 </a>

我只需要选择具有d attribute ='text1'和的那些/ a / b元素组 d attribute ='text4',一旦我识别出这些子文档,我想获得具有d属性值'text5'的e属性的值

希望明确

干杯

DD

4 个答案:

答案 0 :(得分:35)

您可以使用此XPath:

//a[b/c/@d = 'text1' and b/c/@d = 'text4']/b/c[@d = 'text5']/@e

它将选择第1和第3 e='text15'的{​​{1}}和e='text35'

XSLT:

a/b

答案 1 :(得分:5)

  

我只需要选择那些具有d attribute ='text1'和d attribute ='text4'的/ a / b元素组,一旦我识别出这些子文档,我想用d获取e属性的值属性值'text5'

     

希望明确

是的,很清楚XPath的翻译几乎是机械的

(: those /a/b element groups :) a/b 
(: that have d attribute = 'text1' :) [c/@d='text1'] 
(: and d attribute = 'text4' :) [c/@d='text4'] 
(: and .. i want to get the value of the e attributes 
   with d attribute value 'text5' :) / c[@d='text5'] / @e

答案 2 :(得分:4)

您可以使用单个模板匹配所需的组,然后获取所需属性的值:

<xsl:template match="/*/a/b[c[@d='text1'] and c[@d='text4']]">
    <xsl:value-of select="c[@d='text5']/@e"/>
</xsl:template>

假设:

<root>
    <a>
        <b select='yes please'>
            <c d='text1' e='text11'/>
            <c d='text2' e='text12'/>
            <c d='text3' e='text13'/>
            <c d='text4' e='text14'/>
            <c d='text5' e='text15'/>
        </b>
    </a>
    <a>
        <b select='no thanks'>
            <c d='text1' e='text21'/>
            <c d='text3' e='text23'/>
            <c d='text5' e='text25'/>
        </b>
    </a>
    <a>
        <b select='yes please'>
            <c d='text1' e='text31'/>
            <c d='text2' e='text32'/>
            <c d='text3' e='text33'/>
            <c d='text4' e='text34'/>
            <c d='text5' e='text35'/>
        </b>
    </a>
    <a>
        <b select='no thanks'>
            <c d='text4' e='text41'/>
            <c d='text3' e='text43'/>
            <c d='text5' e='text45'/>
        </b>
    </a>
</root>

输出将为text15text35

答案 3 :(得分:1)

使用此单个XPath表达式

/*/a/b[c/@d='text1' and c/@d='text4']
         /c[@d='text5']
             /@e