2017-03-07 44 views
0

我是新來的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

回答

0

您當前的模板相匹配*這將匹配任何元素,但實際上你只希望它的根元素相匹配。

此外,只要你想在沒有命名空間是,在「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> 

看到它在行動