在XSLT编码方面需要帮助



我是XSLT的新手。

我的源XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Header1 xmlns:ns1="urn:src:abc">
<Header2>
<Header3>
<field1>1.1.2017</field1>
<field2>12</field2>
<field3> </field3>
</Header3>
</Header2>
</ns1:Header1>

目标/预期XML

<?xml version="1.0" encoding="UTF-8"?>
<ns2:Header1 xmlns:ns2="urn:tar:abc" xmlns:v1="def.v1">
<Header2>
<v1:Header3>
<field1>1.1.2017</field1>
<field2>12</field2>
<field3> </field3>
</v1:Header3>
</Header2>
</ns2:Header1>

,我还需要删除归档标签之间的空间/空白(field3值有时为空白)

我正在使用以下代码进行转换

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs" version="2.0">
<xsl:template match="*">
<ns2:Header1 xmlns:ns2="urn:tar:abc" xmlns:v1="def.v1">
<Header2> 
<xsl:copy-of select="//Header3"/>
</Header2>
</ns2:Header1>
</xsl:template>
</xsl:stylesheet>

我无法实现我的目标XML。请帮助提前谢谢了问候,pavi

您的当前模板与*匹配,该模板将与任何元素匹配,但实际上您只希望它与根元素匹配。

此外,由于您想将Header3从没有名称空间更改为" def.v1"名称空间,因此您应该使用xsl:apply-templates,而不是xsl:copy-of

<xsl:template match="/*">
    <ns2:Header1 xmlns:ns2="urn:tar:abc" xmlns:v1="def.v1">
        <xsl:apply-templates />
    </ns2:Header1>
</xsl:template>

然后,您需要一个匹配Header3的模板才能更改命名空间

<xsl:template match="Header3" xmlns:v1="def.v1">
    <v1:Header3>
        <xsl:apply-templates />
    </v1:Header3>
</xsl:template>

然后,您只需要身份模板即可复制所有其他节点而无需更改。

尝试此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/*">
        <ns2:Header1 xmlns:ns2="urn:tar:abc" xmlns:v1="def.v1">
            <xsl:apply-templates />
        </ns2:Header1>
    </xsl:template>
    <xsl:template match="Header3" xmlns:v1="def.v1">
        <v1:Header3>
            <xsl:apply-templates />
        </v1:Header3>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

在http://xsltransform.net/jz1puqb

上看到它在行动中

最新更新