XSL:根据原始文档中的多个变量在根元素中设置XML属性

时间:2014-01-28 16:56:36

标签: xml xslt

我有一个XML如下(为便于回答而简化):

<root>
  <element att1="yes" att2="no" other attributes... />
  <element att1="yes" att2="no" other attributes... />
  <element att1="no" att2="yes" other attributes... />
  <element att1="yes" att2="no" other attributes... />
  <element att1="yes" att2="yes" other attributes... />
</root>

我有一个XSL,它将检查att1和att2是否都是“是”,如果是,则将它们放入转换后的XML(格式类似)中。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <root>
      <xsl:for-each select="/root/element">
      <xsl:variable name="att1" select="@att1"/>
      <xsl:variable name="att2" select="@att2"/>
      <xsl:if test="$att1 == 'yes'">
       <xsl:if test="$att2 == 'yes'">
         <!-- print new element with attributes -->
      </xsl:if>
    </xsl:if>
    </xsl:for-each>
    </root>
   </xsl:template>
 </xsl:stylesheet>

我想要做的是,因为如果att1和att2都是“否”,除了以下任何内容都不会被返回:

<root>
</root>

在这种情况下,我想在根元素上标记一个属性,如BlankXML =“Y”,如下所示:

<root BlankXML="Y">
</root>

基本上,如果每个元素的att1和att2都是“no”,则在根元素上传递此BlankXML属性。

这是我被困的地方。在完整的编程语言中,我可能会创建一个计数器变量,并在每次到达打印新XML的部分时递增它,最后,如果计数器仍为0,则添加BlankXML元素。但是在XSL中,我不确定如何做到这一点。根据我的理解,变量更像是常量,不能像这样增加。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:2)

我认为你是从错误的角度看待它。正确的观点来自上方。尝试类似:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<xsl:variable name="output" select="root/element[@att1='yes' and @att2='yes']" />
    <root>
        <xsl:if test="not(count($output))">
            <xsl:attribute name="blank">yes</xsl:attribute>
        </xsl:if>
        <xsl:copy-of select="$output"/>
    </root>
</xsl:template>
</xsl:stylesheet>
相关问题