尝试使用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>
答案 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])"/>