在XSLT编码中需要帮助

时间:2017-03-07 01:48:28

标签: 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>

而且我还需要删除tag3标签之间的空格/空格(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>

我无法实现我的Target XML。请帮助 提前谢谢了 问候, PAVI

1 个答案:

答案 0 :(得分:0)

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

此外,由于您希望将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

中查看此操作