我有一些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
答案 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>
此代码更简单,更易于理解和维护。