我有一个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的东西,但不明白如何在这里使用它。
你能帮助我吗?
答案 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
:是否至少有一个不等于所有前后兄弟姐妹来完成的?
这或多或少是你想要的吗?