如何使用contains和每个函数删除xslt 1.0中的不同节点名称?

时间:2015-03-30 06:41:46

标签: xml xslt

<?xml version="1.0" encoding="UTF-8"?>
    <testInstanceResult>
     <device>
     <name>ritika-101</name>
       <side>D</side>
       </device>
      <device>
      <name>ritika-101</name>
      <side>E</side>
      </device>
      </testInstanceResult>

这是xslt

<xsl:stylesheet version="1.0"       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
             <xsl:for-each select ="testInstanceResult/device">
             <xsl:if test ="contains(./name,'ritika-')">
              <xsl:value-of select="./name"></xsl:value-of>
              </xsl:if>
              </xsl:for-each>
              </xsl:template>
              </xsl:stylesheet>

期望的输出:ritika-101

我需要一次名称,即ritika-101并写入csv文件。让我知道,我在网上检查但感到困惑。我正在检查我的xsl中的每个设备,如果xpath包含ritika-101 den值的选择但是它的到来两次(ritika-101ritika-101)只需要ritika-101

1 个答案:

答案 0 :(得分:0)

要在XSLT 1.0中执行此操作,您可以使用名为Muenchian Grouping的技术。基本上,你将获得每个组的第一个元素,这将是你的不同价值。

因此,您正在按devicename元素进行“分组”,因此您可以像这样定义一个键:

<xsl:key name="names" match="device" use="name" />

然后,要获得不同的值,您的for-each应如下所示:

<xsl:for-each select="testInstanceResult/device[generate-id() = generate-id(key('names', name)[1])]">

您实际上也可以在for-each的文字中添加测试,不过在这里使用starts-with可能会更好。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />

    <xsl:key name="names" match="device" use="name" />

    <xsl:template match="/">
        <xsl:for-each select="testInstanceResult/device
                                [starts-with(name, 'ritika-')]
                                [generate-id() = generate-id(key('names', name)[1])]">
            <xsl:value-of select="name" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>