Извлечение префикса namespace из XML с использованием XSLT - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть SOAP XML. Мне нужно взять XML в переменную и затем извлечь из этой переменной префикс пространства имен, используя XSLT.

Например, если мой XML,

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com">
    <soapenv:Header/>
    <soapenv:Body>
        <a>
            <s>sakdjhkjh</s>
            <j>jhgkjhkjd</j>
        </a>
    </soapenv:Body>
</soapenv:Envelope>

Я должен взять его в переменную с именем input (<xsl:variable name="input"><xsl:copy-of select="."/></xsl:variable>).

Теперь из этой переменной ($ input) я должен извлечь префикс пространства имен 'soapenv'.

Если мои данные,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com">
    <soap:Header/>
    <soap:Body>
        <a>
            <s>sakdjhkjh</s>
            <j>jhgkjhkjd</j>
        </a>
    </soap:Body>
</soap:Envelope>

тогда мне нужно получить мыло в выводе XSLT.

Может ли кто-нибудь помочь мне здесь.

Спасибо,

Najma

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

В этих случаях вы также можете использовать редко используемую ось namespace.Значением узла пространства имен является URI пространства имен, а именем узла пространства имен является префикс пространства имен.Для ясности URI пространства имен определяется как переменная, на которую затем ссылаются.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">

        <!-- variable definitions -->
        <xsl:variable name="input" select="."/>
        <xsl:variable name="nsUri" select="'http://schemas.xmlsoap.org/soap/envelope/'"/>

        <!-- getting the namespace prefix -->
        <xsl:value-of select="name($input/*/namespace::*[. = $nsUri])"/>
    </xsl:template>
</xsl:stylesheet>

(Хотя это редко, URI определенного пространства имен может иметь несколько префиксов, префикс может быть переопределен позже в документеэлементы могут использовать разные префиксы, связанные с одним и тем же пространством имен. Этот пример кода ищет корневой элемент для определения пространства имен и возвращает первый префикс данного URI.)

0 голосов
/ 09 декабря 2011

Хорошо, с XSLT 1.0 вы должны использовать <xsl:variable name="input" select="."/> вместо того, который у вас есть, так как в противном случае любой доступ к пути невозможен (поскольку ваша переменная содержит фрагмент дерева результатов в XSLT 1.0).Что касается префикса, вы можете попробовать substring-before(name($input/descendant-or-self::*), ':').

...