2011-10-27 159 views
2

我有一些XML從而XSLT選擇基於節點

<root> 
    <TemplateNode> 
    <Heading> 
     <ID>1</ID> 
     <Name>HeadingNodeTest</Name> 
     <Order>1</Order> 
     <Text>This is a Heading Node</Text> 
    </Heading> 
    </TemplateNode> 
    <TemplateNode> 
    <SimpleText> 
     <ID>2</ID> 
     <Name>PlainTextNode</Name> 
     <Order>2</Order> 
     <Text>This is some plain text. Blah blah blah .. etc</Text> 
    </SimpleText> 
    </TemplateNode> 
    <TemplateNode> 
    <RadioTemplateNode> 

上...等

我希望能夠做一個XSLT選擇基於所述前進/單文本類型位 爲例如

<xsl:for-each select="TemplateNode"> 
    <xsl:choose> 
     <xsl:when test="TemplateNode/* = Header"> 
      ..do stuff 
     </xsl:when> 
     <xsl:when test="TemplateNode/* = SimpleText"> 
      ..do other stuffstuff 
     </xsl:when> 
     ...etc 
    </xsl:choose> 
</xsl:for-each select="TemplateNode"> 

* <的xsl:當測試= 「TemplateNode/* =部首」 > 我甚至可以做這樣的事情,還是我最好更改XML並選擇它?

還是我需要設置一個變量,並選擇.. ..?

感謝 NAT

回答

1

你不應該你的數據適應你的代碼。如果您的XML是可以的,請保持原樣。這會工作,例如

<xsl:for-each select="/root/TemplateNode"> 
    <xsl:choose> 
    <xsl:when test="Heading"> 
     ..do stuff 
    </xsl:when> 
    <xsl:when test="SimpleText"> 
     ..do other stuff 
    </xsl:when> 
    ... 

當然,如果各個TemplateNode子元素相互排斥這僅適用。這是另一種選擇:

<xsl:apply-templates select="/root/TemplateNode/*"/> 

然後

<xsl:template match="/root/TemplateNode/Heading"> 
    ..do stuff 
</xsl:template> 
<xsl:template match="/root/TemplateNode/SimpleText"> 
    ..do other stuff 
</xsl:when> 
0

正是在XSLT一個很好的原則,以避免條件語句儘可能。

而不是

<xsl:for-each select="TemplateNode"> 
    <xsl:choose> 
     <xsl:when test="TemplateNode/* = Header"> 
      ..do stuff 
     </xsl:when> 
     <xsl:when test="TemplateNode/* = SimpleText"> 
      ..do other stuffstuff 
     </xsl:when> 
     ...etc 
    </xsl:choose> 
</xsl:for-each select="TemplateNode"> 

<xsl:apply-templates select="TemplateNode"/> 

,也有這些模板

<xsl:template match="TemplateNode[Heading]"> 
    <!-- Processing here --> 
</xsl:template> 

<xsl:template match="TemplateNode[SimpleText]"> 
    <!-- Processing here --> 
</xsl:template> 

<xsl:template match="TemplateNode[RadioTemplateNode]"> 
    <!-- Processing here --> 
</xsl:template> 

此代碼更簡單,更易於理解和維護