我试图获取值的X路径,但嵌套条件得到错误

时间:2012-02-13 18:00:48

标签: xpath expression

我试图通过为条件赋予唯一值U003_O100_001T_609644,从几个ViewItem中找到带有谓词的XPath表达式,其值为1900310。请参阅下面的代码,

< B:ViewItem>

< B:字段>

c为C:KeyValueOfstringanyType>

c为C:钥匙及GT; ID< / C:钥匙及GT;

< c:Value> 1900310< / c:Value>

< / C:KeyValueOfstringanyType>

c为C:KeyValueOfstringanyType>

c为C:钥匙及GT;子类型LT; / C:钥匙及GT;

c为C:值> U003_O100_00IT_609644< / C:值>

< / C:KeyValueOfstringanyType>

c为C:KeyValueOfstringanyType>

c为C:钥匙及GT; SectionType< / C:钥匙及GT;

c为C:值>发行< / C:值>

< / C:KeyValueOfstringanyType>

< / B:的Fileds>

< / B:ViewItem>

我尝试按如下方式编写表达式,

Query = / Envelope / Body / GetViewByIdResponse / GetViewByIdResult / Items / ViewItem / Fields / KeyValueOfstringanyType [Value ='U003_O100_001T_609644'] / Value [Key ='ID']

但它没有给我价值。你能帮忙吗?

感谢

1 个答案:

答案 0 :(得分:2)

选择所需元素的一个XPath表达式是

 /b:ViewItem
    /b:Fields
       /c:KeyValueOfstringanyType
          [c:Key = 'ID']
                   /c:Value

请注意所提供的XML文档具有名称空间,并且任何包含未加前缀的元素名称的XPath表达式都不会选择所需的元素,但以下格式的表达式除外:

 /*[local-name() = 'ViewItem']
    /*[local-name() = 'Fields']
       /*[local-name() = 'KeyValueOfstringanyType']
               [*[local-name() = 'Key'] = 'ID']
                   /*[local-name() = 'Value']

此外,对于上面的第一个XPath表达式,前缀为"b:""c:"的名称空间 必须“注册”(阅读XPath引擎的文档如何做到这一点)。

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:b="some:b" xmlns:c="some:c">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/b:ViewItem
        /b:Fields
           /c:KeyValueOfstringanyType
              [c:Key = 'ID']
                /c:Value
    "/>

==============

  <xsl:copy-of select=
   "/*[local-name() = 'ViewItem']
         /*[local-name() = 'Fields']
               /*[local-name() = 'KeyValueOfstringanyType']
                    [*[local-name() = 'Key'] = 'ID']
                            /*[local-name() = 'Value']
   "/>
 </xsl:template>
</xsl:stylesheet>

将此XSLT转换应用于以下XML文档(提供的一个,针对严重的错误形式进行了更正):

<b:ViewItem xmlns:b="some:b" xmlns:c="some:c">
    <b:Fields>
        <c:KeyValueOfstringanyType>
            <c:Key>ID</c:Key>
            <c:Value>1900310 </c:Value>
        </c:KeyValueOfstringanyType>
        <c:KeyValueOfstringanyType>
            <c:Key>SubType</c:Key>
            <c:Value>U003_O100_00IT_609644</c:Value>
        </c:KeyValueOfstringanyType>
        <c:KeyValueOfstringanyType>
            <c:Key>SectionType</c:Key>
            <c:Value>Released</c:Value>
        </c:KeyValueOfstringanyType>
    </b:Fields>
</b:ViewItem>

评估两个XPath表达式,并输出他们选择的节点

<c:Value xmlns:c="some:c" xmlns:b="some:b">1900310 </c:Value>

==============

<c:Value xmlns:c="some:c" xmlns:b="some:b">1900310 </c:Value>