2011-05-12 45 views
-2

我輸入文件,以獲取不同的值如何在XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<TstData> 
<ENT_A_BLY Common_Key="3195 KG" NAME="COMPDATA_AC"/> 
<SOLUTIONS> 
    <A_BLY Name="LPT nozzle cracked." Common_Key="489BB8CC-5978-4D45-B781-929703D1826A"> 
     <SOLUTION> 
      <ID>2060000000000000000001309</ID> 
      <TITLE Common_Key="FD08B464-B115-433F-82A9-0B2BC5CC0A4E"> LPT(Low Pressure Turbine) Damage</TITLE> 
     </SOLUTION> 
     <SOLUTION> 
      <ID>206000000000000000001310</ID> 
      <TITLE Common_Key="FFDSFE64-8DF9-43RF-8DF9-0DFSD5CC0A4E"> LPT(Low Pressure Turbine) Damage</TITLE> 
     </SOLUTION> 
     <SOLUTION> 
      <ID>2060000000000000000001316</ID> 
      <TITLE Common_Key="ADUIEI42-B115-433F-82A9-0B2BC5CC0A4E">Temperature High due to LPT(Low Pressure Turbine) Damage</TITLE> 
     </SOLUTION>  
    </A_BLY> 
</SOLUTIONS> 
</TstData> 

在XSLT,我想從2個解決方案只獲取一個標題文本。(同時作爲標題名是相同),以便輸出中不會顯示重複的數據。

我的XSLT ..(部分顯示)。

<xsl:element name="FMs"> 
<xsl:variable name="distinctFM" select="distinct-values(//SOLUTION/TITLE/@Common_Key)"/> 
<xsl:for-each select="$distinctFM"> 
    <xsl:variable name="TITLENAME" select="."/> 
    <xsl:variable name="TITLENAME1" select="//SOLUTIONS/A_BLY/SOLUTION/TITLE[@Common_Key=$TITLENAME]"/> 
    <xsl:element name="FailureMode"> 
     <xsl:attribute name="CommonKey"><xsl:value-of select="$TITLENAME"/></xsl:attribute> 
     <xsl:attribute name="FMName"><xsl:value-of select="substring(normalize-space($TITLENAME1),1,200)"/></xsl:attribute> 
    </xsl:element> 
</xsl:for-each> 
</xsl:element> 

我期待這種格式輸出,

<FM CommonKey="FD08B464-B115-433F-82A9-0B2BC5CC0A4E" FMName="LPT(Low Pressure Turbine) Damage"/> 
<FM CommonKey="ADUIEI42-B115-433F-82A9-0B2BC5CC0A4E" FMName="Temperature High due to LPT(Low Pressure Turbine) Damage"/> 

但是,目前雖然我調試,爲FMName,它在變TITLENAME1拋出錯誤。請幫我設計這個輸出。

感謝 拉姆

+0

如果它拋出一個錯誤,如果你說錯誤是什麼,它會讓每個人的生活變得更容易。 – 2011-05-12 17:06:48

+0

因爲您沒有給出錯誤消息而下調計數。 – 2011-05-12 17:13:27

+1

尼布甲尼撒綜合徵 - 不只是解釋我的夢,告訴我我的夢是什麼*和*的解釋。 – LarsH 2011-05-12 20:39:54

回答

2

試試這個:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="SOLUTIONS"> 
    <FMs> 
     <xsl:apply-templates /> 
    </FMs> 
    </xsl:template> 

    <xsl:template match="SOLUTION"> 
    <FailureMode CommonKey="{TITLE/@Common_Key}" FMName="{TITLE}" /> 
    </xsl:template> 

    <xsl:template match="SOLUTION[preceding-sibling::SOLUTION/TITLE = TITLE]" /> 
</xsl:stylesheet> 

的最後一個模板基本上覆蓋了前一個那裏是用相同的標題作爲當前一個以前的解決方案節點,並輸出什麼。

可替代地,它可以使用一個密鑰來完成:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="FMName" match="SOLUTION" use="TITLE" /> 

    <xsl:template match="SOLUTIONS"> 
    <FMs> 
     <xsl:apply-templates /> 
    </FMs> 
    </xsl:template> 

    <xsl:template match="SOLUTION"> 
    <xsl:if test="generate-id() = generate-id(key('FMName',TITLE)[1])"> 
     <FailureMode CommonKey="{TITLE/@Common_Key}" FMName="{TITLE}" /> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

此解決方案使用xsl:if爲僅包括那些具有給定名稱的第一個節點的節點。

在這種情況下,我會推薦第一種方法,但後者可以使用更復雜的XML結構更靈活。

+0

感謝Flynn..It幫了我很多 – Ramm 2011-05-12 14:27:29

+0

Aditya的原代碼使用了distinct-values(),這可能是一個非常有效的用於查找和刪除重複項的內置構造,​​並且您已用特別的XSLT 1.0技術取代了它,這些技術相比之下可能非常低效。我不稱之爲改進。 Downvoting。 – 2011-05-12 17:12:30

+0

考慮在這種情況下使用不同值也涉及到使用查找'CommonKey'屬性的值,我懷疑它是否比基於拉式風格的方法明顯更有效,這種方法讀起來更簡單。如果不需要'CommonKey'屬性,我完全同意你的看法。 – Flynn1179 2011-05-12 20:24:23

3

即使您沒有給出錯誤信息,我已經計算出您得到的錯誤!這是因爲當上下文項是原子值時,您正在使用以「/」開頭的路徑表達式。在上下文更改爲distinct-values()的結果之前,需要使用一些變量(如$ root)來啓動路徑,該變量綁定到輸入文檔的根目錄。

+1

「你被授予徽章'Prophet',告訴提問者如何解決他們的錯誤,而不告訴你錯誤信息。」 – LarsH 2011-05-12 21:05:53

0

你不想要重複的TITLE值?這會讓你開始!

XSL

<xsl:template match="/"> 
    <Foobar> 
     <xsl:for-each select="//TITLE[not(.=preceding::*)]"> 
      <xsl:element name="FM"> 
       <xsl:attribute name="CommonKey"><xsl:value-of select="@Common_Key"/></xsl:attribute> 
       <xsl:attribute name="FMName"><xsl:value-of select="."/></xsl:attribute> 
      </xsl:element> 
     </xsl:for-each> 
    </Foobar> 
</xsl:template> 

結果:

<Foobar xmlns="http://www.w3.org/1999/xhtml"> 
    <FM CommonKey="FD08B464-B115-433F-82A9-0B2BC5CC0A4E" FMName=" LPT(Low Pressure Turbine) Damage"></FM> 
    <FM CommonKey="ADUIEI42-B115-433F-82A9-0B2BC5CC0A4E" FMName="Temperature High due to LPT(Low Pressure Turbine) Damage"></FM> 
</Foobar> 

更多信息can be found here