XSLT:如何检查孩子的平等

时间:2015-11-17 07:07:30

标签: html xml xslt xpath

我有一个XML <row>元素数组,每个元素都可以有一个<query>元素数组。它看起来像这样:

<row><query></query><query></query></row>
<row><query></query><query></query></row>
<row><query></query><query></query></row>
<row><query></query><query></query></row>

我希望打印一个表格,以防query个子元素在row个元素中有所不同,如果query个孩子在所有row个子元素中相同,则打印一个逗号分隔的字符串孩子们。

我为此撰写<xsl:when>

<xsl:choose>
  <xsl:when test="[Table condition]">
    <!--code to print table-->
  </xsl:when>
  <xsl:otherwise>
    <!--code to print string-->
  </xsl:otherwise>
</xsl:choose>

Table Condition应该是什么?

我正在使用XSLT v 1.0。我知道有一些名为deep equals的东西,但不明白如何在这里使用它。

你能帮助我吗?

2 个答案:

答案 0 :(得分:0)

deep-equal是XSLT / XPath 2.0中引入的一个函数,下面是一个使用它的示例(当然需要使用像Saxon 9,Altova,XmlPrime这样的XSLT 2.0处理器):

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="table[not(row[some $sibling in ../row satisfies not(deep-equal(., $sibling))])]">
        <xsl:value-of select="row/query" separator=","/>
    </xsl:template>
</xsl:transform>

我显然已将一个案例的条件置于match模式中,只是让其他表的复制通过身份转换。

使用类似

的示例输入
<root>
    <table>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
    </table>
    <table>
        <row><query>2</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
    </table>
</root>

结果是

<root>
    1,2,1,2,1,2,1,2
    <table>
        <row><query>2</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
        <row><query>1</query><query>2</query></row>
    </table>
</root>

答案 1 :(得分:0)

如果query元素中只有文本,那么在XSLT 1.0中应该不会太难。例如,我假设两个rows的样本可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <row><query>foo</query><query>foo</query></row>
    <row><query>foo1</query><query>foo2</query></row>
</root>

如果您通过XSLT模板(如

)处理此数据
<xsl:for-each select="//row">
        <xsl:choose>
            <xsl:when test="query[not(. = preceding-sibling::query or . = following-sibling::query)]">
                There is at least one query element which is different from the others
                in the same raw.
            </xsl:when>
            <xsl:otherwise>
                All query elements in this row are equal.
            </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>

您得到了预期的结果:第一个row被视为“相等”,另一个被视为“不同”。 这是通过检查前后query:是否至少有一个不等于所有前后兄弟姐妹来完成的?

这或多或少是你想要的吗?