您好我是xml的新手,想要使用xsl样式表
比较一些值`<a>
<b> <name>foo</name> </b>
<b> <name>bar</name> </b>
<b> <name>fred</name> </b>
<b> <name>fred</name> </b>
</a>`
我想编写一个样式表来检查所有b节点并返回具有相同值的值,因此使用上面的简单示例我希望输出类似于:
“你的重复字符串是fred”
我已经使用了一个for循环来返回所有值但是比较名称并返回重复项已经躲过了我。如果可能的话,我希望通过使用while类型循环来实现比较。
感谢您的帮助。
答案 0 :(得分:2)
XSLT 1.0:使用密钥的简单解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kNameByVal" match="name" use="."/>
<xsl:template match="/*">
Your duplicate strings are: <xsl:text/>
<xsl:apply-templates select=
"b/name[generate-id() = generate-id(key('kNameByVal', .)[2])]"/>
</xsl:template>
<xsl:template match="name">
<xsl:if test="position() >1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<强> II。 XSLT 2.0解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="vSeq" select="data(/a/b/name)"/>
<xsl:template match="/">
Your duplicate strings are: <xsl:text/>
<xsl:sequence select="$vSeq[index-of($vSeq,.)[2]]"/>
</xsl:template>
</xsl:stylesheet>
<强> III。 XPath 2.0单行
$vSeq[index-of($vSeq,.)[2]]
这将生成给定序列中的所有值,这些值具有重复项(一组来自重复项)。
答案 1 :(得分:1)
使用while循环是违反XSLT原则的,即使可以完成。
有一些更容易的方法来做你想要的,例如:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='text' />
<xsl:template match="b">
<xsl:if test='preceding::b/name/text()=./name/text()'>
Your duplicate is: <xsl:copy-of select='./name/text()' />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这是寻找节点b,并检查前面的b节点是否具有相同的名称文本
答案 2 :(得分:1)
基于<xsl:key>
的解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kName" match="b/name" use="text()" />
<xsl:template match="/">
<xsl:for-each select="//b/name">
<xsl:if test="count(key('kName', text())) > 1">
<xsl:value-of select="concat('Your duplicate is: ', text(), '
')" />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
对于大型输入文档,这比使用preceding::
检查的解决方案更有效。