XML - XSLT - 从输出 XML 文档中删除 xmlns=""
XML - XSLT - Remove xmlns="" from output XML document
我有以下 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 帮助我在我昨天制作的类似 post 的基础上构建了这个:
<?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>
我决定针对我一开始提到的那个单独做一个 post,因为这是一个不同的问题,
谢谢!
亚历山大·哈辛托
一个 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 特性,并且只适用于 XSLT 之后的 xpath 表达式中的元素名称(例如在 select
或 match
属性中)解析为 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 帮助我在我昨天制作的类似 post 的基础上构建了这个:
<?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>
我决定针对我一开始提到的那个单独做一个 post,因为这是一个不同的问题,
谢谢!
亚历山大·哈辛托
一个 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 特性,并且只适用于 XSLT 之后的 xpath 表达式中的元素名称(例如在 select
或 match
属性中)解析为 XML。