XPATH表达式获取数据类型QName的XML属性的本地名称和名称空间

时间:2013-03-31 17:40:30

标签: xslt xpath

我希望通过以下示例从w3schools http://www.w3schools.com/xml/xml_xsl.asp开始使用XSLT显示XML文档。打开XML文档时,XSLT转换为HTML将在浏览器中完成。

现在,我有困难a)获取本地名称和2)在两个单独的表达式中获取QName类型的属性内容的命名空间。

示例

<service xmlns:ns3="http://www.mycompany.com/" name="ns3:PersonService">
    <serviceInterface name="ns3:PersonServiceInterface">
         <operation>...</operation>
</serviceInterface>

问题

  1. 什么XPATH表达式将 PersonService 作为属性 name 的内容返回? <xsl:value-of select="@name"/>返回 ns3:PersonService ,但我不想要名称空间前缀。
  2. 什么XPATH表达式将 http://www.mycompany.com/ 作为属性 name 的命名空间返回?

1 个答案:

答案 0 :(得分:2)

  

1.什么XPATH表达式将PersonService作为属性名称的内容返回?

假设service是顶级元素的子级(您没有提供完整且格式良好的XML文档),请使用

substring-after(/*/service/@name, ':')
  

2.什么XPATH表达式将http://www.mycompany.com/作为属性名称的名称空间返回?

在与上述相同的假设下,使用:

/*/service/namespace::*[name() = substring-before(../@name, ':')]

基于XSLT的验证

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

 <xsl:template match="/">
  <xsl:value-of select="substring-after(/*/service/@name, ':')"/>
============
  <xsl:value-of select=
   "/*/service/namespace::*[name() = substring-before(../@name, ':')]"/>
 </xsl:template>
</xsl:stylesheet>

此XSLT转换,应用于以下XML文档(提供的,但已完成):

<t>
    <service xmlns:ns3="http://www.mycompany.com/"
             name="ns3:PersonService">
        <serviceInterface name="ns3:PersonServiceInterface">
            <operation>...</operation>
        </serviceInterface>
    </service>
</t>

评估两个XPath表达式并将这些评估的结果复制到输出中:

PersonService
============
http://www.mycompany.com/