XSLT值基于多个标签及其值来选择

时间:2016-10-24 21:51:32

标签: xml xslt

我想知道如何从xml以下获取价值。我尝试了几种不同的方法,似乎找不到正确的解决方案。

<a>
    <aid>ok</aid>
    <b>
        <bid>ok</bid>
        <c>
            <cid>ok</cid>
            <d>
                <dValue>goal</dValue>
            </d>
        </c>
    </b>
</a>

条件必须符合以下标准:

  • 如果<a><aid>值正常
  • 如果<a><b><bid>值正常
  • 如果<a><b><c><cid>值正常
  • 然后我需要<a><b><c><d><dValue>
  • 的价值

任何帮助都会非常感激,因为我已经在这上花了几个小时:)哦,我正在使用xslt 2.0。

2 个答案:

答案 0 :(得分:3)

<xsl:value-of select="a[aid='ok']/b[bid='ok']/c[cid='ok']/d/dValue"/>

答案 1 :(得分:1)

更一般的任务

如果元素的名称无关紧要,并且路径的深度(嵌套元素的数量)可以是任意的,但子项的名称是附加“id”的父名称,则此XPath 2.0表达式在所有这些情况下产生想要的结果,包括当前的情况:

//dValue[every $anc in ../ancestor::* 
          satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string()

XSLT 2.0验证

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:sequence select=
    "//dValue[every $anc in ../ancestor::* 
       satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string()"/>
  </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时

<a>
    <aid>ok</aid>
    <b>
        <bid>ok</bid>
        <c>
            <cid>ok</cid>
            <d>
                <dValue>goal</dValue>
            </d>
        </c>
    </b>
</a>

评估表达式并输出此评估的结果

goal

在此XML文档上应用相同的转换

<x>
    <xid>ok</xid>
    <y>
        <yid>ok</yid>
        <z>
            <zid>ok</zid>
            <t>
                <dValue>goal2</dValue>
            </t>
        </z>
    </y>
</x>

再次产生想要的正确结果

goal2