XSLT基于节点进行选择

时间:2011-10-27 08:44:22

标签: xslt

我有一些XML

<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>

...等

我希望能够根据Heading / SimpleText类型位进行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">

* &lt; xsl:when test =“TemplateNode / * = Header”&gt; 我甚至可以做这样的事情,还是我最好更改XML并选择它?

或者我是否需要设置变量并选择...?

感谢 NAT

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

此代码更简单,更易于理解和维护