2015-03-25 94 views
0

我試圖想出一個xslt,它可以將源xml中的所有內容複製到目標中,或者根據源文件中的某個值生成一個空文件。xslt條件轉換

假設我有source1.xml,像以下:

<Order> 
    <isDigitalProduct>true</isDigitalProduct> 
    <productID>1234</productID> 
<Order> 

和source2.xml,如下所示:

<Order> 
    <isDigitalProduct>false</isDigitalProduct> 
    <productID>5678</productID> 
<Order> 

如何修改我的XSLT來評估<isDigitalProduct>的價值所以當它的值爲「真」時,將所有東西都複製,當其值爲「假」時產生空白輸出?對於上面的例子,source1.xml會將其內容複製過來,而轉換後的source2.xml會產生一個空白文件。

任何幫助表示讚賞!

還有一個問題,如果不是複製一切我需要將<isDigitalProduct>元素轉換爲<SerialNumber>。例如,使用source2.xml仍然轉換爲空輸出,同時將source1.xml轉換爲:

<Order> 
    <SerialNumber>ABC</SerialNumber> 
    <productID>1234</productID> 
<Order> 

Thanx!

+0

你能不能也發佈你已經嘗試過的XSL-T? – potame 2015-03-25 11:03:56

+0

重新提出您的問題:「ABC」值是從哪裏來的? – 2015-03-25 16:05:01

+0

哦,「ABC」將只是一個固定的隨機值,所以假設這個硬編碼值是安全的。 – 2015-03-25 16:13:42

回答

0

如何修改我的XSLT來評估 的價值<isDigitalProduct>,以便當它的值爲「true」時,按原樣複製所有內容 ,並在其值爲「false」時產生空白輸出?

如果這是你想要做的一切,你可以做簡單:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 


<xsl:template match="/"> 
    <xsl:copy-of select="Order[isDigitalProduct='true']"/> 
</xsl:template> 

</xsl:stylesheet> 

還有一個問題,如果,而不是複製一切,我需要 改造<isDigitalProduct>元素到<SerialNumber>

在這種情況下,而不是照搬符合Order,你將模板應用到它 - 而這模板中做任何必要的修改,例如:

<xsl:template match="/"> 
    <xsl:apply-templates select="Order[isDigitalProduct='true']"/> 
</xsl:template> 

<xsl:template match="Order"> 
    <xsl:copy> 
     <SerialNumber>ABC</SerialNumber> 
     <xsl:copy-of select="productID"/> 
    </xsl:copy> 
</xsl:template> 
0

類似的東西應該工作,但你很可能會得到一些錯誤,如果結果樹是空的...

<xsl:template match="Order"> 
    <xsl:choose> 
    <xsl:when test="isDigitalProduct/text() = 'true'"> 
     <xsl:copy-of select="."/> 
    </xsl:when> 
    <xsl:otherwise> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template>