要求在XSLT编码

问题描述:

我是新来的XSLT .Kindly帮我下面的查询说明:要求在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> 

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

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

此外,只要你想在没有命名空间是,在“def.v1”命名空间是改变Header3,你应该利用的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> 

这样,你会只需要身份模板到所有其他节点复制无需改动。

http://xsltransform.net/jz1PuQb

试试这个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> 

看到它在行动