Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 如何在没有名称空间的情况下将xml的一部分转换为新的xml?_Xslt - Fatal编程技术网

Xslt 如何在没有名称空间的情况下将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的一部分转换为没有名称空间的新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>
            </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处理器。