在XSLT中,如何找到XML元素属性的命名空间?

时间:2011-08-31 01:22:41

标签: xml xslt

尝试使用namespace-uri函数来查找属性的命名空间。

<xsl:template match="xse:seeAlso">
<xsd:xmlEntityReference xml:space="preserve">
    <xsl:value-of select="namespace-uri()"/>#E/<xsl:value-of select="@ref"/>
</xsd:xmlEntityReference>
</xsl:template>

我想要元素的“ref”属性的命名空间。有提示吗?

UPDATE 1 为了更清楚,我想要“ref”属性引用的元素的命名空间。抱歉有任何困惑。

更新2 @empo:这是其中一个架构的片段

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:html="http://www.w3.org/1999/xhtml"
            xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
             xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
      targetNamespace="http://schemas.microsoft.com/wix/IIsExtension"
                xmlns="http://schemas.microsoft.com/wix/IIsExtension">

    <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />

    <xs:element name="Certificate">
        <xs:annotation>
            <xs:documentation>
                Used to install and unintall certificates.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="CertificateRef"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <!-- Cut off -->
        </xs:complexType>
    </xs:element>

    <xs:element name="CertificateRef">
        <xs:annotation>
            <xs:documentation>
                ...
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="Certificate"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <!-- Cut off -->
        </xs:complexType>
    </xs:element>
</xs:schema>

这是变换的样本

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:xsd="http://schemas.xsddoc.codeplex.com/schemaDoc/2009/3"
                xmlns:ddue="http://ddue.schemas.microsoft.com/authoring/2003/5"
                xmlns:xlink="http://www.w3.org/1999/xlink"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
                xmlns:xhtml="http://www.w3.org/1999/xhtml"
                exclude-result-prefixes="msxsl xs xse">
  <xsl:output method="xml" indent="yes"/>

  <xsl:param name="parentItemType"/>
  <xsl:param name="parentItemNamespace"/>
  <xsl:param name="parentItemUri"/>

  <xsl:param name="currentItemType"/>
  <xsl:param name="currentItemNamespace"/>
  <xsl:param name="currentItemUri"/>

  <xsl:template match="*">
    <xsl:apply-templates select="xs:annotation" />
  </xsl:template>

  <xsl:template match="xse:seeAlso">
    <xsd:xmlEntityReference xml:space="preserve">
        <xsl:value-of select="namespace-uri()"/>#E/<xsl:value-of select="@ref"/>
    </xsd:xmlEntityReference>
  </xsl:template>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:3)

如果如图所示选择了@ref属性的值,则命名空间URI值将为空。该属性将位于“未命名的命名空间”(或“null命名空间”中) “)并且它没有名称空间URI值。

如果属性绑定到命名空间,那么它将具有命名空间前缀,并且需要在XPath中进行寻址(例如@foo:ref)。

您可以验证这一点并获取属性(或任何元素或属性节点)的名称空间URI,并将其作为参数传递给namespace-uri()函数。

namespace-uri(@ref)

答案 1 :(得分:1)

  

为了更清楚,我想要“ref”属性引用的元素的命名空间。对不起任何混淆

您正在搜索以下

 <xsl:value-of select="namespace-uri(//*[@name=current()/@ref])"/>

或者,甚至:

 <xsl:value-of select="namespace-uri(//xs:element[@name=current()/@ref])"/>