嗨,我在代码中遇到if条件时遇到了麻烦。好吧,这里准确的是XML文件:
<root name="fristLevel">
<test name="secondaryLevel_1">
<medium>
<scribe>
<cloude>
something is here
</cloude>
</scribe>
<demo>
something is here
</demo>
</medium>
</test>
<test name="secondaryLevel_2">
<medium>
<demo>
something is here
</demo>
</medium>
</test>
</root>
我正在寻找的是IF条件,如果medium
具有如下所示的子节点,它将执行某些操作:
<xsl:for-each select="root/test">
<xsl:if test="medium/scribe/node()">
<!-- something here -->
</xsl:if>
</xsl:for-each>
但这对我不起作用。有人有另一个更好的主意吗?
答案 0 :(得分:1)
您的想法看起来不错,但也许您未能放置此代码 在适当的地方。
即使您的代码放在与整体匹配的模板中
文档/
,输出将不是格式正确的XML,
因为XML文档必须包含单个节点
在主(根)级别。
大概是:
root
相匹配的模板
(您的主节点)。<xsl:copy>
),
否则输出将没有任何单个主节点。<xsl:copy>
和
</xsl:copy>
标签)应该放置您的<xsl:for-each
循环。如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="test">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="medium/scribe/node()">
<HasScribe><xsl:value-of select="medium/scribe"/></HasScribe>
</xsl:if>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:transform>
如您所见,我还为属性添加了xsl:apply-templates
,
这样就可以在输出中看到哪个源元素
已经生成了特定的输出元素。
对于一个有效的示例,您的XML稍有更改,请参见http://xsltransform.net/ei5Pwjn