2017-04-11 70 views
0

我需要幫助保留XSLT轉換上的名稱空間。我看到其他線程有解決方案,但我不明白他們。當我使用下面的XSLT轉換時,所有的名稱空間都消失了。以下是我想要完成的。任何幫助深表感謝!謝謝!XSLT在輸出上保留名稱空間

之前轉換XML:

<?xml version='1.0' encoding='UTF-8'?> 
<Worker 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:this="this.file/eib" 
    xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions" 
    xmlns:tv="java:com.workday.esb.intsys.TypedValue"> 
    <Detail> 
     <EmployeeID>123456</EmployeeID> 
     <PayCode>Earning</PayCode> 
     <Amount>4243.20</Amount> 
    </Detail> 
    <Detail> 
     <EmployeeID>123456</EmployeeID> 
     <PayCode>Deduction</PayCode> 
     <Amount>2265.60</Amount> 
    </Detail> 
</Worker> 

我的XSLT轉換:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" exclude-result-prefixes="xsl wd is xsd this env" 
    xmlns:wd="urn:com.workday/bsvc" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:this="urn:this-stylesheet"> 

    <xsl:output indent="yes" method="xml"/> 

    <xsl:template match="/"> 
     <xsl:copy> 
      <Worker> 
       <xsl:for-each select="Worker" > 
        <Detail> 
         <EmployeeID><xsl:value-of select="Detail[(PayCode ='Earning')]/EmployeeID"/></EmployeeID> 
         <PayCode><xsl:value-of select="Detail[(PayCode ='Earning')]/PayCode"/></PayCode> 
         <Amount><xsl:value-of select="Detail[(PayCode ='Earning') and (string-length(Amount) > 0)]/Amount"/></Amount> 
        </Detail> 
       </xsl:for-each> 
      </Worker> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

所需的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<Worker 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:this="this.file/eib" 
    xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions" 
    xmlns:tv="java:com.workday.esb.intsys.TypedValue"> 
    <Detail> 
     <EmployeeID>123456</EmployeeID> 
     <PayCode>Earning</PayCode> 
     <Amount>4243.20</Amount> 
    </Detail> 
</Worker> 
+1

名稱空間聲明消失,因爲名稱空間未在輸出中使用。爲什麼你需要保留它們(或者認爲你需要保留它們)? –

回答

1

至少在XSLT 2.0(您使用的版本),名稱空間消失,因爲您使用了exclude-result-prefixes屬性。

只要將其刪除,XSLT工作表中包含的所有命名空間(xsl除外)將按照外觀順序顯示在輸出中。

但是,如果您決定省略所有命名空間,那麼寫入exclude-result-prefixes="#all"會更容易,而不是再次寫入它們。

+0

謝謝!這很簡單,它的工作。正如你所看到的,我是初學者水平。 –

+0

@RemoHernandez請注意,這將保留樣式表中聲明的名稱空間,而不是在輸入XML中聲明的名稱空間。 –

1

我看不出有什麼充分理由繼續不使用的命名空間聲明在你的輸出中。但如果你真的想擁有它們,你爲什麼不只是複製它們(作爲它們的父元素的一部分) - 例如:

XSLT

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/Worker"> 
    <xsl:copy> 
     <xsl:copy-of select="Detail[PayCode ='Earning']"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

當這個應用到你的輸入例如,結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<Worker xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:this="this.file/eib" 
     xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions" 
     xmlns:tv="java:com.workday.esb.intsys.TypedValue"> 
    <Detail> 
     <EmployeeID>123456</EmployeeID> 
     <PayCode>Earning</PayCode> 
     <Amount>4243.20</Amount> 
    </Detail> 
</Worker> 

演示:http://xsltransform.net/gVhD8Qt

+0

謝謝你的幫助!這工作。這是爲了進行Workday集成,命名空間和輸出是打印出excel摘要文件所必需的。 –