2

http://www.namspace.org/impl选择由XYZImpl实现的“抽象”节点的正确查询是什么?

<...>
  <Abstract xmlns:q3="http://www.namspace.org/impl"
                xsi:type="q3:XYZImpl">
    <...></...>
  </Abstract>
  <Abstract xmlns:q8="http://www.namspace.org/another"
                xsi:type="q8:XYZImpl">
    <...></...>
  </Abstract>
 </...>

订单和命名空间前缀不在的控制之下

如果文档只包含唯一的实现,则以下查询“有效”:

//Abstract[contains(@xsi:type,'XYZImpl')]

但我正在寻找完全限定名称(命名空间+名称)的正确规范...:/

4

2 回答 2

2

使用

   /*/Abstract
       [substring-after(@xsi:type, ':') = 'XYZImpl']
          [namespace::*
              [name() = substring-before(../@xsi:type, ':')
              and
               . = 'http://www.namspace.org/impl'
              ]
          ]

这将选择AbstractXML 文档顶部元素的任何子元素,该元素的名称空间带有前缀,该前缀也是其xsi:type属性中包含的 QName 值的前缀。属性中包含的 QName 值的“local-name”部分xsi:type正是 string "XYZImpl"

基于 XSLT 的验证

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

 <xsl:template match="/">
     <xsl:copy-of select=
      "/*/Abstract
           [substring-after(@xsi:type, ':') = 'XYZImpl']
              [namespace::*
                  [name() = substring-before(../@xsi:type, ':')
                  and
                   . = 'http://www.namspace.org/impl'
                  ]
              ]
      "/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时(由提供者生成,通过使其格式正确):

<t xmlns:xsi="some:xsi">
      <Abstract xmlns:q3="http://www.namspace.org/impl"
                    xsi:type="q3:XYZImpl">
       </Abstract>
      <Abstract xmlns:q8="http://www.namspace.org/another"
                    xsi:type="q8:XYZImpl">
      </Abstract>
</t>

选择所需的正确元素并将其复制到输出

<Abstract xmlns:q3="http://www.namspace.org/impl" xmlns:xsi="some:xsi" xsi:type="q3:XYZImpl"/>

请注意:为了成功评估 XPath 表达式,xsi必须在您的 XPath 实现中注册带有前缀的适当名称空间。

于 2012-04-10T13:28:06.450 回答
0

当然,使用有效样本回答 xml 问题会更容易......

这可能不是最好的方法,但以下对我有用:

//Abstract[namespace::*[.="http://www.namspace.org/impl"] and contains(@xsi:type,":XYZImpl")]
于 2012-04-10T09:43:46.697 回答