Xslt 如何在没有名称空间的情况下将xml的一部分转换为新的xml?
我很难将xml的一部分转换为没有名称空间的新xml。 输入xml为:Xslt 如何在没有名称空间的情况下将xml的一部分转换为新的xml?,xslt,Xslt,我很难将xml的一部分转换为没有名称空间的新xml。 输入xml为: <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <node1 xmlns="http://a.com"> <ServiceData> <b:test xmlns:b="http://b.com"> <b:somtag> <
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<node1 xmlns="http://a.com">
<ServiceData>
<b:test xmlns:b="http://b.com">
<b:somtag>
</b:somtag>
</b:test>
</ServiceData>
</node1>
我想要的是:
<a>
<c>
<ServiceData>
<b:test xmlns:b="http://b.com">
<b:somtag>
</b:somtag>
</b:test>
</ServiceData>
</c>
</a>
我想要的格式没有ServiceData的命名空间。
谢谢你的帮助
此外,我尝试使用此xsl,但无法删除“xmlns=”http://a.com“”
我得到的结果是:
<a>
<c>
<ServiceData>
<b:test xmlns:b="http://b.com" xmlns="http://a.com">
<b:somtag>
</b:somtag>
</b:test>
</ServiceData>
</c>
</a>
那么:
XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://a.com">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/node1">
<a>
<c>
<ServiceData>
<xsl:copy-of select="ServiceData/*" copy-namespaces="no" />
</ServiceData>
</c>
</a>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:test="http://a.com"
exclude-result-prefixes="test">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/test:node1">
<a>
<c>
<ServiceData>
<xsl:apply-templates select="test:ServiceData/*"/>
</ServiceData>
</c>
</a>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
注: 冗余名称空间声明不应对接收应用程序产生任何影响。这里收到的结果在语义上与您在问题中显示的结果相同 那么: XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://a.com">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/node1">
<a>
<c>
<ServiceData>
<xsl:copy-of select="ServiceData/*" copy-namespaces="no" />
</ServiceData>
</c>
</a>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:test="http://a.com"
exclude-result-prefixes="test">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/test:node1">
<a>
<c>
<ServiceData>
<xsl:apply-templates select="test:ServiceData/*"/>
</ServiceData>
</c>
</a>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
注:
冗余名称空间声明不应对接收应用程序产生任何影响。这里收到的结果在语义上与您在问题中显示的结果相同 谢谢你的回复。我不确定它是否能在您的环境中工作,但我只剩下了一点。@很可能您是使用XSLT1.0处理器运行它的。(如果将2.0样式表交给1.0处理器,它将忽略它不理解的部分,例如
xpath默认名称空间
和copy名称空间
属性,它们是该样式表工作方式的关键)。@MichaelKaym,有没有办法通过xsl1实现这一点?@Conquer请参阅我的帖子中的添加内容。@michael.hor257k,非常感谢,这对我很有用。因为我在JavaSpring框架中使用这个转换,我不知道如何更改为XSL2处理器。谢谢您的回复。我不确定它是否能在您的环境中工作,但我只剩下了一点。@很可能您是使用XSLT1.0处理器运行它的。(如果将2.0样式表交给1.0处理器,它将忽略它不理解的部分,例如xpath默认名称空间
和copy名称空间
属性,它们是该样式表工作方式的关键)。@MichaelKaym,有没有办法通过xsl1实现这一点?@Conquer请参阅我的帖子中的添加内容。@michael.hor257k,非常感谢,这对我很有用。因为我在JavaSpring框架中使用这个转换,我不知道如何更改为XSL2处理器。