Как игнорировать пространства имен во время перевода xsl - PullRequest
7 голосов
/ 06 июня 2011

У меня есть xml, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.books.com/SRK">
    <name>English</name>
</books

Мне потребовался следующий вывод после перевода с использованием xsl.

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <name>English</name>
</books>

Мне нужен xsl, чтобы игнорировать пространство имен. Я пыталсячто-то, но не работает с пространством имен.

Мне нужна ваша помощь. Ваша помощь будет принята с благодарностью.

Ответы [ 2 ]

6 голосов
/ 06 июня 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="@*|node()[not(self::*)]">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

применительно к предоставленному документу XML :

<books xmlns="http://www.books.com/SRK">
    <name>English</name>
</books>

дает желаемый, правильный результат :

<books>
   <name>English</name>
</books>
3 голосов
/ 06 июня 2011

Работает, только если я включаю вышеупомянутые шаблоны, если я добавляю некоторые другие шаблоны, кроме вышеупомянутого, тогда перевод вообще не работает. Ни один из шаблонов не выполняется.* Возможно, вам не хватает объявления пространства имен для элемента book.Пример:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:b="http://www.books.com/SRK"
    exclude-result-prefixes="b">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

        <!-- @dimitre's answer templates -->

    <xsl:template match="b:name">
          <!-- your template for name -->
    </xsl:template>

</xsl:stylesheet>

Кроме того, обязательно используйте функцию local-name() для получения имени элемента без связанного пространства имен.


Пример

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:b="http://www.books.com/SRK"
    exclude-result-prefixes="b">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>


    <xsl:template match="b:input">
        <xsl:element name="{local-name(.)}">
                <xsl:apply-templates select="b:name"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="b:name">
        <xsl:element name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:element>
            <lhs>
                <xsl:apply-templates select="following-sibling::b:lhs/b:evaluate"/>
            </lhs>
    </xsl:template>

    <xsl:template match="b:evaluate">
        Something to evaluate...    
    </xsl:template>

</xsl:stylesheet>

получает:

<?xml version="1.0" encoding="UTF-8"?>
<input>
<name>English</name>
<lhs>
        Something to evaluate...    
    </lhs>
</input>

Второй пример

Вы можете создать отдельное преобразование с именем local-identity.xsl содержащий решение @Dimitre.Затем вы можете импортировать его в свое преобразование.Поскольку у вас есть пространство имен, для сопоставления элементов вы должны изменить все ваши XPath, включая префикс, который вы объявите в преобразовании, как в следующем примере:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:brl="http://www.xyz.com/BRL"
    exclude-result-prefixes="brl"
    version="1.0">

    <xsl:import href="local-identity.xsl"/>

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>


    <xsl:template match="/brl:rule">
     <!-- do your staff, select using brl prefix -->
     <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...