в XSLT, как найти пространство имен атрибута элемента XML? - PullRequest
3 голосов
/ 31 августа 2011

Попытка использовать функцию 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" элемента.Любой совет?

ОБНОВЛЕНИЕ 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 ]

3 голосов
/ 31 августа 2011

Если значение атрибута @ref выбрано, как показано, то значение URI пространства имен будет ничем. Атрибут будет находиться в «безымянном пространстве имен» (или «нулевом пространстве имен») иу него не будет значения URI пространства имен.

Если атрибут связан с пространством имен, то он будет иметь префикс пространства имен и должен будет указываться в качестве такового в XPath (например, @foo:ref).

Вы можете проверить это и получить URI пространства имен атрибута (или любого элемента или узла атрибута), передав его в качестве параметра функции namespace-uri () .

namespace-uri(@ref)
1 голос
/ 01 сентября 2011

Чтобы сделать его более понятным, мне нужно пространство имен элемента, на который ссылается атрибут "ref".Извините за путаницу

Вы ищете следующие

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

или даже:

 <xsl:value-of select="namespace-uri(//xs:element[@name=current()/@ref])"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...