XML - XSLT - Удалить xmlns="" из выходного XML-документа

У меня есть следующий входной документ XML:

<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://jasperreports.sourceforge.net/jasperreports" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" 
        repName="FirstElementTemp" 
        date="10-05-2001">
    <element1>
        <subElement>
            SomeData
        </subElement>
    </element1>
    <element2>
        <subElement type="2"/>
    </element2>
</report>

И со следующей таблицей стилей XSLT этот пользователь @Mads Hansen помог мне создать аналогичный пост, который я сделал вчера:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xpath-default-namespace="http://jasperreports.sourceforge.net/jasperreports"
  xmlns:jsp="http://jasperreports.sourceforge.net/jasperreports"
  exclude-result-prefixes="xs jsp"
  expand-text="yes"
  version="3.0">


<xsl:param name="doc2"  xmlns="">
    <secondDoc>
    <elementTemps>
        <elemTemp ID="1" name="FirstElementTemp" />
        <elemTemp ID="2" name="SecondTemplate" />
    </elementTemps>
    <elementReps>
        <elemRep tmpID="1" name="FirstElementRep" >
            <value>FIRST DATA</value>
        </elemRep>
        <elemRep tmpID="2" name="SecondTemplate">
            <value>SECOND DATA</value>
        </elemRep>
    </elementReps>
    </secondDoc>     
  </xsl:param>

<xsl:output indent="yes" cdata-section-elements="cDataElement"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:key name="key1" match="elemTemp" use="@name" xpath-default-namespace=""/>
  <xsl:key name="key2" match="elemRep" use="@tmpID" xpath-default-namespace=""/>

 <xsl:template match="report/*[1]">
    <xsl:variable name="temp" select="key('key1', ../@repName, $doc2)"/>
    <xsl:variable name="rep" select="key('key2', $temp/@ID, $doc2)"/>
    <valueIs>
        <xsl:value-of select="$rep/value" xpath-default-namespace=""/>
    </valueIs>
    <xsl:next-match/>
</xsl:template> 

</xsl:stylesheet>

Я смог получить желаемый выходной XML-документ, который хотел, только с одной ошибкой. Это вывод, который я получаю из него:

<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://jasperreports.sourceforge.net/jasperreports"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
        repName="FirstElementTemp"
        date="10-05-2001">
    <valueIs xmlns="">FIRST DATA</valueIs>
   <element1>
        <subElement>
            SomeData
        </subElement>
    </element1>
    <element2>
        <subElement type="2"/>
    </element2>
</report>

Как видите, новый элемент, который я добавил, <valueIs> идет с xmlns="" приписывать. Я знаю, что это означает, что нет ни в одном пространстве имен, но как я могу добавить этот элемент без xmlns атрибут? Что мне нужно изменить в таблице стилей XSLT?

Так что в основном это вывод, который я хочу, просто чтобы быть более понятным:

<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://jasperreports.sourceforge.net/jasperreports"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
        repName="FirstElementTemp"
        date="10-05-2001">
    <valueIs>FIRST DATA</valueIs>
   <element1>
        <subElement>
            SomeData
        </subElement>
    </element1>
    <element2>
        <subElement type="2"/>
    </element2>
</report>

Я решил сделать отдельный пост к тому, на который я ссылался в начале, так как это другая проблема,

Спасибо!

Александр Хасинто

1 ответ

Решение

Документ XSLT также является документом XML, и в этом документе XML valueIs Элемент не находится в пространстве имен.

Как вы хотите, чтобы это было в http://jasperreports.sourceforge.net/jasperreports Пространство имен, просто сделай это...

<valueIs xmlns="http://jasperreports.sourceforge.net/jasperreports">

Вы можете добавить объявление этого пространства имен по умолчанию в xsl:stylesheet вместо этого, если вы хотите, особенно если вам нужно создать другие элементы в другом месте

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xpath-default-namespace="http://jasperreports.sourceforge.net/jasperreports"
  xmlns:jsp="http://jasperreports.sourceforge.net/jasperreports"
  xmlns="http://jasperreports.sourceforge.net/jasperreports"
  exclude-result-prefixes="xs jsp"
  expand-text="yes"
  version="3.0">

В ответ на ваш xpath-default-namespace является функцией XSLT и применяется только к именам элементов в выражениях xpath (например, в select или же match атрибуты) после того, как XSLT был проанализирован как XML.

Другие вопросы по тегам