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.