2009-10-13 24 views
0

從非規範化的XML得到具體的值說我有一個看起來像這樣的XML:如何使用XSLT

<Items> 
    <ItemType1>A</ItemType1> 
    <ItemValue1>100</ItemValue1> 
    <IteType2>B</ItemType2> 
    <ItemValue2>10</ItemValue2> 
    <ItemType3>C</ItemType3> 
    <ItemValue3>0</ItemValue3> 
    <ItemType4>D</ItemType4> 
    <ItemValue4>50</ItemValue4> 
</Items> 

而我感興趣的是得到ItemValueX的內容,其中ItemTypeX值C. 在這種情況下,我應該得到0(ItemType3 = C,ItemValue3 = 0)

我需要在XSLT中執行此操作。

所以,最終的結果可能是這樣的:

<ChoosenItem> 
    <ItemType>C</ItemType> 
    <ItemValue>0</ItemValue> 
</ChoosenItem> 

任何想法?

回答

2

試試這個:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="itemValue">C</xsl:param> 
    <xsl:template match="/Items"> 
    <xsl:apply-templates 
     select="//*[starts-with(name(), 'ItemType') and . = $itemValue]" /> 
    </xsl:template> 

    <xsl:template match="*"> 
    <ChoosenItem> 
     <ItemType><xsl:value-of select="." /></ItemType> 
     <ItemValue><xsl:value-of select="following-sibling::*" /></ItemValue> 
    </ChoosenItem> 
    </xsl:template> 

</xsl:stylesheet> 

另一種方法,避免match="*"

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="itemValue">C</xsl:param> 
    <xsl:template match="/Items"> 
     <xsl:call-template name="GetItem"> 
     <xsl:with-param name="id" 
      select="//*[starts-with(name(), 'ItemType') and . = $itemValue]" /> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="GetItem"> 
    <xsl:param name="id" /> 
    <ChoosenItem> 
     <ItemType><xsl:value-of select="$id" /></ItemType> 
     <ItemValue><xsl:value-of select="$id/following-sibling::*" /></ItemValue> 
    </ChoosenItem> 
    </xsl:template> 

</xsl:stylesheet> 
+0

這是因爲它避免了做一個'換each'只有每個子節點一個更好的方法,並且代碼看起來更清潔:) – 2009-10-13 14:52:58

+0

以下同胞:: *只是讀你的答案後,來到了,所以也謝謝你=) – 2009-10-13 14:55:25

+0

這正是我所需要的,它像詹姆斯說的那樣乾淨:)謝謝。 – 2009-10-13 16:42:17

2

這工作,假設,當然,你將永遠都匹配的ItemType雙和ItemValue

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:for-each select="/Items/*"> 
    <xsl:if test=". = 'D'"> 
    <xsl:variable name="pos" select="position() + 1"/> 
    <ChoosenItem> 
    <ItemType><xsl:value-of select="."/></ItemType> 
    <ItemValue><xsl:value-of select="/Items/*[$pos]"/></ItemValue> 
    </ChoosenItem> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

應能提供以下的XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<ChoosenItem> 
    <ItemType>D</ItemType> 
    <ItemValue>50</ItemValue> 
</ChoosenItem>