3

我想按照 w3schools 中的以下示例使用 XSLT 显示 XML 文档:http: //www.w3schools.com/xml/xml_xsl.asp。打开 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作为属性名称的内容返回?<xsl:value-of select="@name"/>返回ns3:PersonService但我不想要命名空间前缀。
  2. 什么 XPATH 表达式将返回http://www.mycompany.com/作为属性名称的命名空间?
4

1 回答 1

3

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/
于 2013-03-31T17:44:25.027 回答