Исключение пространств имен из XML - PullRequest
2 голосов
/ 28 марта 2012

Мой xsl-файл:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:go="http://www.google.com"
    exclude-result-prefixes="go">
<xsl:include href="SomeLibrary.xsl"/>

    <xsl:template match="/">

        <xsl:call-template name="SomeTemplate">
            <xsl:with-param name="Element" select="'randomParam'"/>
        </xsl:call-template>

    </xsl:template>

</xsl:stylesheet>

Файл SomeLibrary.xsl:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.google.com">
    <xsl:template name="SomeTemplate">
    <xsl:param name="Element"/>
        <Blabla>
            <xsl:value-of select="$Element" />    
        </Blabla>
    </xsl:template>
</xsl:stylesheet>

Входной xml: просто используйте пустой XML.Результат таков:

<?xml version="1.0" encoding="UTF-8"?>

<Blabla xmlns="http://www.google.com">
    randomParam
</Blabla>

Я хочу, чтобы узел "Blabla" был без пространства имен.Как я могу удалить его или сделать так, чтобы он не попал туда без изменения моего «SomeLibrary.xsl»?

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Если вы не хотите редактировать импортированный код таблицы стилей, способ удалить пространство имен - это двухпроходное преобразование (которое в XSLT 1.0 требует использования функции расширения xxx:node-set()):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext" >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
   <xsl:variable name="vrtfPass1">
     <xsl:call-template name="SomeTemplate">
                <xsl:with-param name="Element" select="'randomParam'"/>
       </xsl:call-template>
     </xsl:variable>

     <xsl:variable name="vPass1" select="ext:node-set($vrtfPass1)"/>
     <xsl:apply-templates select="$vrtfPass1/node()" mode="pass2"/>
 </xsl:template>

 <xsl:template match="*" mode="pass2">
  <xsl:element name="{name()}">
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates mode="pass2"/>
  </xsl:element>
 </xsl:template>

 <xsl:template name="SomeTemplate" xmlns="http://www.google.com">
   <xsl:param name="Element"/>
            <Blabla>
                <xsl:value-of select="$Element" />
            </Blabla>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любому документу XML (не используется), получается требуемый результат (удалено пространство имен по умолчанию) :

<Blabla>randomParam</Blabla>

Обновление

ОП указал в комментарии, что он использует Xalan 2.07.

Ниже приведено почти то же решение, но с пространством имен и именем для функции xxx:node-set(), которое используется в Xalan:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="x" >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
   <xsl:variable name="vrtfPass1">
     <xsl:call-template name="SomeTemplate">
                <xsl:with-param name="Element" select="'randomParam'"/>
       </xsl:call-template>
     </xsl:variable>

     <xsl:variable name="vPass1" select="x:nodeset($vrtfPass1)"/>
     <xsl:apply-templates select="$vrtfPass1/node()" mode="pass2"/>
 </xsl:template>

 <xsl:template match="*" mode="pass2">
  <xsl:element name="{name()}">
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates mode="pass2"/>
  </xsl:element>
 </xsl:template>

 <xsl:template name="SomeTemplate" xmlns="http://www.google.com">
   <xsl:param name="Element"/>
            <Blabla>
                <xsl:value-of select="$Element" />
            </Blabla>
 </xsl:template>
</xsl:stylesheet>
1 голос
/ 28 марта 2012

Явно создайте их с помощью:

<xsl:element name="Blabla" namespace="">...</xsl:element>

, но это означает возиться с файлом SomeLibrary.xsl.

0 голосов
/ 28 марта 2012

добавить exclude-result-prefixes="go" к элементу таблицы стилей.
и, конечно, обновить объявление пространства имен со значения по умолчанию до xmlns:go="http://www.google.com"

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