在条件为XSLT的情况下查找特殊节点

时间:2018-06-29 12:43:09

标签: html xml xslt

嗨,我在代码中遇到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>

但这对我不起作用。有人有另一个更好的主意吗?

1 个答案:

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