我有一个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>
答案 0 :(得分:0)
<xslt:apply-templates select="element[contains(allowedListPadded,concat(';',state,';'))][position() < 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,';'))]"/>
应该适用。