2016-12-30 70 views
0

新手訪問此站點並使用xslt,但遇到了一個障礙,將SSRS 2008v2呈現的xml文件轉換爲另一個第三方EDI轉換的XSL原始格式。我一直在搜索這個網站和其他一些,但現在掙扎着把它放在一起。我從下面的原始xml數據開始;使用xslt對xml文件進行多次轉換1

<Invoices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.spscommerce.com/RSX" xsi:schemaLocation="http://www.spscommerce.com/RSX http://tfl- sql01/ReportServer_SQL2012? %2FTesting%2FINTest&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID= jn5ugdirg4m02nmodnm0hynq&rc%3ASchema=True" Name="INTest"> 
<Invoices1> ***need to remove*** 
    <ivhID_Collection> ***need to remove*** 
    <Invoices>...</Invoices> 
    <Invoices>...</Invoices> 
    <Invoices> 
     <Invoice> 
     <Header1> 
      <InvoiceHeader>...</InvoiceHeader> 
      <PaymentTerms>...</PaymentTerms> 
      <Dates>...</Dates> 
      <Address>...</Address> 
      <References>...</References> 
      <ChargesAllowances>...</ChargesAllowances> 
      <LineItem_Collection> ***need to remove and replace with </Header>*** 
      <LineItem> 
       <InvoiceLine>...</InvoiceLine> 
       <ProductOrItemDescription>...</ProductOrItemDescription> 
      </LineItem> 
      <LineItem> 
       <InvoiceLine>...</InvoiceLine> 
       <ProductOrItemDescription>...</ProductOrItemDescription> 
      </LineItem> 
      </LineItem_Collection> ***need to remove*** 
      <Summary>...</Summary> 
     </Header1> ***need to remove*** 
     </Invoice> 
    </Invoices> 
    <Invoices>...</Invoices> 
    <Invoices>...</Invoices> 
    <Invoices>...</Invoices> 
    /ivhID_Collection> ***need to remove*** 
</Invoices1> ***need to remove*** 
</Invoices> 

試圖在此結構中取而代之;

<Invoices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.spscommerce.com/RSX" xsi:schemaLocation="http://www.spscommerce.com/RSX http://tfl-sql01/ReportServer_SQL2012?%2FTesting%2FINDoItBest%20v7&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID=jn5ugdirg4m02nmodnm0hynq&rc%3ASchema=True" Name="INDoItBest v7"> 
<Invoices>...</Invoices> 
<Invoices>...</Invoices> 
    <Invoices> 
    <Invoice> 
     <Header> 
     <InvoiceHeader>...</InvoiceHeader> 
     <PaymentTerms>...</PaymentTerms> 
     <Dates>...</Dates> 
     <Address>...</Address> 
     <References>...</References> 
     <ChargesAllowances>...</ChargesAllowances> 
     </Header> 
     <LineItem> 
     <InvoiceLine>...</InvoiceLine> 
     <ProductOrItemDescription>...</ProductOrItemDescription> 
     </LineItem> 
     <LineItem> 
     <InvoiceLine>...</InvoiceLine> 
     <ProductOrItemDescription>...</ProductOrItemDescription> 
     </LineItem> 
     <Summary>...</Summary> 
    </Invoice> 
    </Invoices> 
    <Invoices>...</Invoices> 
    <Invoices>...</Invoices> 
    <Invoices>...</Invoices> 
</Invoices> 

我做了使用這個樣式表了一些進展,但我堅持頁眉標籤的重新組合和元素名稱空間的顯示。

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

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!--rule to suppress the undesired nodes--> 
<xsl:template match="t:Invoices1|t:ivhID_Collection"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="t:LineItem_Collection"> 
    <xsl:apply-templates/> 
</xsl:template> 

<!--<xsl:template match="t:Invoice/t:Header1"> 
    <xsl:apply-templates/> 
</xsl:template>--> 

<!-- Identity Transform --> 
<xsl:template match="t:Header1"> 
    <xsl:copy> 
    <xsl:element name="Header"> 
     <xsl:apply-templates select="@*|t:InvoiceHeader|t:PaymentTerms|t:Dates|t:Address|t:References|t:ChargesAllowances"/> 
    </xsl:element> 
    <xsl:apply-templates select="@*|t:LineItem_Collection|t:Summary"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Had to comment out --> 
<!--<xsl:template match="t:Invoice/t:Header1"> 
    <xsl:apply-templates/> 
</xsl:template>--> 

樣式表產生了我所需要的大部分內容,但是當我試圖去除Header1標籤(代碼註釋掉)時失敗了。另外,努力去理解爲什麼「排除結果前綴」不適用於從新的xml文件中刪除命名空間。

<Invoices xmlns="http://www.spscommerce.com/RSX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spscommerce.com/RSX http://tfl-sql01/ReportServer_SQL2012?%2FTesting%2FINDoItBest%20v7&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID=jn5ugdirg4m02nmodnm0hynq&rc%3ASchema=True" Name="INDoItBest v7"> 
<Invoices>...</Invoices> 
<Invoices>...</Invoices> 
<Invoices> 
    <Invoice> 
    <Header1> 
     <Header xmlns=""> 
     <InvoiceHeader xmlns="http://www.spscommerce.com/RSX">... </InvoiceHeader> 
     <PaymentTerms xmlns="http://www.spscommerce.com/RSX">... </PaymentTerms> 
     <Dates xmlns="http://www.spscommerce.com/RSX">...</Dates> 
     <Address xmlns="http://www.spscommerce.com/RSX">...</Address> 
     <References xmlns="http://www.spscommerce.com/RSX">...</References> 
     <ChargesAllowances xmlns="http://www.spscommerce.com/RSX">... </ChargesAllowances> 
     </Header> 
     <LineItem> 
     <InvoiceLine>...</InvoiceLine> 
     <ProductOrItemDescription>...</ProductOrItemDescription> 
     </LineItem> 
     <LineItem> 
     <InvoiceLine>...</InvoiceLine> 
     <ProductOrItemDescription>...</ProductOrItemDescription> 
     </LineItem> 
     <Summary> 
     <TotalAmount>756.8400</TotalAmount> 
     <TotalSalesAmount>727.1600</TotalSalesAmount> 
     <TotalLineItemNumber>2</TotalLineItemNumber> 
     </Summary> 
    </Header1> 
    </Invoice> 
</Invoices> 
<Invoices>...</Invoices> 
<Invoices>...</Invoices> 
<Invoices>...</Invoices> 
</Invoices> 

任何意見或其他選擇將不勝感激!

+0

'exclude-result-prefixes'隻影響樣式表中文字結果元素的行爲,樣式表中沒有文字結果元素。我懷疑你是從它的名字猜測屬性的語義,這總是很危險。 –

回答

0

您已經在XSLT中找到了匹配t:Header1的模板,因此您不應再添加一個匹配它的模板,因爲只有其中一個可以應用。 (在你的情況下,如果你確實添加了一個匹配t:Invoice\t:Header1的模板,那麼由於指定了父項,它將具有更高的優先級,因爲它只是匹配t:Header1並被替代使用)。

你需要做的是把所有的邏輯放在單個模板中。在這種情況下,您只需從該模板中刪除xsl:copy以避免Header1被複制到輸出樹中。此外,當您創建Header時,您將在沒有命名空間中創建它,而不是在綁定到前綴「t」的名稱空間中創建它。因此,子元素將被賦予新的名稱空間聲明,因爲它們仍將位於該名稱空間中。

一種方式做到這一點是隻需要添加一個「命名空間」屬性爲xsl:element,像這樣:

<xsl:element name="Header" namespace="http://www.spscommerce.com/RSX"> 

或者,您也可以通過只是在做<Header>創建元素,但你將需要添加默認命名空間聲明到XSLT,以確保它在正確的命名空間中獲得輸出。

試試這個XSLT:

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

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!--rule to suppress the undesired nodes--> 
<xsl:template match="t:Invoices1|t:ivhID_Collection"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="t:LineItem_Collection"> 
    <xsl:apply-templates/> 
</xsl:template> 

<!-- Identity Transform --> 
<xsl:template match="t:Header1"> 
    <xsl:apply-templates select="@*" /> 
    <Header> 
     <xsl:apply-templates select="@*|t:InvoiceHeader|t:PaymentTerms|t:Dates|t:Address|t:References|t:ChargesAllowances"/> 
    </Header> 
    <xsl:apply-templates select="t:LineItem_Collection|t:Summary"/> 
</xsl:template> 
</xsl:stylesheet> 

作爲一個方面說明,在你的XSLT你也馬上創建Header元素

<xsl:apply-templates select="@*|t:LineItem_Collection|t:Summary"/> 

後這樣做,如果Header1有屬性,這會令你失望想要複製,因爲在創建子元素後嘗試向父元素添加屬性是個錯誤。這就是爲什麼在我的XSLT中,我將語句分成兩部分。

+0

謝謝蒂姆,它工作得很好。這真的幫了我。 –