嗨,我的代码中有一个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>但这对我不起作用。还有其他更好的主意吗?
发布于 2018-07-01 05:20:44
您的想法看起来不错,但可能您没有将这些代码放在适当的位置。
即使您的代码被放置在与整个文档/匹配的模板中,输出也不会是格式良好的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
https://stackoverflow.com/questions/51102060
复制相似问题