在XSLT中处理列表



我有一个变量

的元素列表
|ELEMENT1|ELEMENT2|ELEMENT3|ELEMENT4|ELEMENT5|

如果任何请求元素与此匹配,我应该显示本地名称及其值。

请求XML:

<Root>
<element1>Test1</element1>
<child>
    <element2>222</element2>
</child>
<secondChild>
    <element2>234</element2>
</secondChild>
<thirdchild>
    <element3>5w2</element3>
</thirdchild>
</Root>
XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/> 
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"></xsl:variable>
<xsl:variable name="list"><xsl:value-of select="'|ELEMENT1|ELEMENT2|ELEMENT3|ELEMENT4|ELEMENT5|'"/></xsl:variable> 
<xsl:template match="/">
        <xsl:for-each select="//*[contains(translate($list,$lower,$upper),concat('|',translate(local-name(),$lower,$upper),'|'))]">
        <xsl:value-of select="concat(local-name(),':',.,'|')"></xsl:value-of>            
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

期望输出:

element1:Test1|element2:222|element3:5w2|

但是我得到

element1:Test1|element2:222|element2:234|element3:5w2|

这是因为我在XML中的两个地方有element2。我不应该在处理时读取第二个元素2。

你能帮我一下吗

过滤掉前面有同名元素的所有元素。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"/>
  <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" /> 
  <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
  <xsl:variable name="list" select="'|ELEMENT1|ELEMENT2|ELEMENT3|ELEMENT4|ELEMENT5|'" />
  <xsl:template match="/">
    <xsl:for-each select="//*[
      contains(
        concat('|', translate($list, $lower, $upper), '|'),
        concat('|', translate(local-name(), $lower, $upper), '|')
      )
    ]">
      <xsl:if test="not(preceding::*[local-name() = local-name(current())])">
        <xsl:value-of select="concat(local-name(), ':', ., '|')" />
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

你可以定义一个键

<xsl:key name="name" match="*" use="local-name()"/>

然后在你的条件下你检查

<xsl:for-each select="//*[generate-id() = generate-id(key('name', local-name())[1])][contains(translate($list,$lower,$upper),concat('|',translate(local-name(),$lower,$upper),'|'))]">

相关内容

  • 没有找到相关文章

最新更新