我有xml数据。并使用xslt转换解析它。 我需要的是找出特定元素的所有子元素是否具有相同的嵌套元素值。看:
如果我们在:
中有相同的值<parent>
<child>
<compare>1</compare>
</child>
<child>
<compare>1</compare>
</child>
</parent>
我们应该复制所有树并将标志设置为“1”:
<parent>
...
</child>
<flag>1</flag>
</parent>
如果我们有不同的值:
<parent>
<child>
<compare>1</compare>
</child>
<child>
<compare>2</compare>
</child>
</parent>
我们应该复制所有树并将标志设置为“”:
<parent>
...
</child>
<flag/>
</parent>
答案 0 :(得分:2)
比较是否有任何不同于第一个?
<xsl:template match="/parent">
<parent>
<xsl:copy-of select="*"/>
<flag>
<xsl:if test="not(child[1]/compare != child/compare)">1</xsl:if>
</flag>
</parent>
</xsl:template>
这确实意味着如果你只有一个它将有一个标志1
答案 1 :(得分:1)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="parent">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<flag>
<xsl:variable name="comp" select="child[1]/compare"/>
<!-- add flag value only if child/compare are the same -->
<xsl:value-of select="child[1]/compare[
count(current()/child)
=
count(current()/child[ compare=$comp ]
)]"/>
</flag>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<flag><xsl:value-of select=
"substring('1', 2 - not(child[compare != current()/child/compare]))"/></flag>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于以下XML文档时:
<parent>
<child>
<compare>1</compare>
</child>
<child>
<compare>1</compare>
</child>
</parent>
会产生想要的正确结果:
<parent>
<child>
<compare>1</compare>
</child>
<child>
<compare>1</compare>
</child>
<flag>1</flag>
</parent>
对此XML文档应用相同的转换时:
<parent>
<child>
<compare>1</compare>
</child>
<child>
<compare>2</compare>
</child>
</parent>
再次生成想要的正确结果:
<parent>
<child>
<compare>1</compare>
</child>
<child>
<compare>2</compare>
</child>
<flag/>
</parent>
请注意:
使用和覆盖身份规则。
根本没有使用明确的条件指令(或变量)。