xslt 1.0选择前n个元素,其子元素是允许值之一

时间:2013-12-12 12:16:46

标签: xslt-1.0

我有一个xml,我必须找到第一个n元素,其子元素具有允许值之一 例如为了跟随xml,我想选择状态为WA或NY的元素。允许状态列表是动态值,所以我不能使用

<xsl:apply-templates select="element[(state='WA' or state='NY')]"/>

当我尝试使用contains过滤它时,什么也没发生。 e.g。

<xsl:variable name="allowedListPadded">;WA;NY;</xsl:variable>
<xslt:apply-templates select="element[contains($allowedListPadded,concat(';',state,';'))]"/>

XML:

<items>
  <element>
    <state>WA</state>
    <title>Washington</title>
  </element>
  <element>
    <state>OR</state>
    <title>Oragon</title>
  </element>
  <element>
    <state>NY</state>
    <title>New York</title>
  </element>
  <element>
    <state>WA</state>
    <title>Washington News</title>
  </element>
  <element>
    <state>TX</state>
    <title>Texas</title>
  </element>
</items>

我正在考虑过滤apply-templates中的元素,然后在模板中,想要使用position()&lt; ñ。但是只被第一部分卡住了。

按要求完成xslt。

<xslt:stylesheet version="1.0" xmlns:xslt="http://www.w3.org/1999/XSL/Transform"  
  exclude-result-prefixes="xslt">
  <xslt:output omit-xml-declaration="yes" method="xml" />
<xslt:template match="root">
    <xslt:text>{"statelist":</xslt:text>
    <xslt:choose>
      <xslt:when test="$allowedListPadded=''">        
        <!-- if no list is present, give default state -->
        <xslt:apply-templates select="element[state = 'WA']"/>
      </xslt:when>
      <xslt:otherwise>
        <xslt:apply-templates select="element[contains(allowedListPadded,concat(';',state,';'))]"/>
      </xslt:otherwise>
    </xslt:choose>
    <xslt:text>}</xslt:text>
  </xslt:template>
</xslt:stylesheet>

2 个答案:

答案 0 :(得分:0)

<xslt:apply-templates select="element[contains(allowedListPadded,concat(';',state,';'))][position() &lt; 5]"/>

这里的技巧不是在谓词中使用运算符,而是使用两个谓词。第一个创建包含所选元素的节点集,第二个返回一个节点集,该节点集包含该节点集的5个(例如)元素。

答案 1 :(得分:0)

您正在匹配root元素,并且您的xml中没有任何root元素。您必须更改它并匹配items元素。你的方法:

<xslt:variable name="allowedListPadded">;WA;NY;</xslt:variable>
<xslt:apply-templates select="element[contains($allowedListPadded,concat(';',state,';'))]"/>

应该适用。