<list>
<field ows_ID="1081" Program="106;#Virginia" ProgramCategory="United States"/>
<field ows_ID="1082" Program="110;#NewYork" ProgramCategory="United States" />
<field ows_ID="1083" Program="106;#Texas;#112;#Virginia;#118;#Mass" ProgramCategory="United States" />
<field ows_ID="1084" Program="111;#Florida;#180;#Texas" ProgramCategory="United States" />
<field ows_ID="1085" Program="" ProgramCategory="Australia" />
<field ows_ID="1086" Program="122;#Sydney;#Melbourne" ProgramCategory="Australia" />
<field ows_ID="1087" Program="121;#Melbourne" ProgramCategory="Australia" />
<field ows_ID="1088" Program="118;#Mass" ProgramCategory="United States" />
<field ows_ID="1088" Program="123;#Brisbane" ProgramCategory="Australia" />
</list>
我有一些xml,其中我需要找到count,其中ProgramCategory等于某个国家和程序不应该等于某些状态,我从其他xml动态获取。从另一个xml我得到程序与每个ProgramCategory相关联,然后我需要使用条件过滤上面的xml
foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$State4])
问题是我可以得到n不。我正在通过其他xml的循环获得的状态。
所以说,如果我从另一个与美国相关的xml是弗吉尼亚州,德克萨斯州和佛罗里达州,那么美国的数量是2,如果我说与澳大利亚有联系的州是墨尔本,悉尼和布里斯班那么数是1我正在使用xsl 1.0。
答案 0 :(得分:1)
好问题,+ 1。
我认为没有一个XPath 1.0表达式可以计算到想要的数量。
这是一个XSLT 1.0解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pFilteredStates">
<state>Virginia</state>
<state>Texas</state>
<state>Florida</state>
</xsl:param>
<xsl:param name="pCountry" select="'United States'"/>
<xsl:variable name="vFiltered" select=
"document('')/*/xsl:param[@name='pFilteredStates']/*
"/>
<xsl:template match="/">
<xsl:variable name="vCount">
<xsl:apply-templates select="*"/>
</xsl:variable>
<xsl:value-of select="string-length($vCount)"/>
</xsl:template>
<xsl:template match="field">
<xsl:if test=
"@ProgramCategory = $pCountry
and
not($vFiltered[contains(current()/@Program,
.
)
]
)
">
<xsl:text>1</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<list>
<field ows_ID="1081" Program="106;#Virginia" ProgramCategory="United States"/>
<field ows_ID="1082" Program="110;#NewYork" ProgramCategory="United States" />
<field ows_ID="1083" Program="106;#Texas;#112;#Virginia;#118;#Mass" ProgramCategory="United States" />
<field ows_ID="1084" Program="111;#Florida;#180;#Texas" ProgramCategory="United States" />
<field ows_ID="1085" Program="" ProgramCategory="Australia" />
<field ows_ID="1086" Program="122;#Sydney;#Melbourne" ProgramCategory="Australia" />
<field ows_ID="1087" Program="121;#Melbourne" ProgramCategory="Australia" />
<field ows_ID="1088" Program="118;#Mass" ProgramCategory="United States" />
<field ows_ID="1088" Program="123;#Brisbane" ProgramCategory="Australia" />
</list>
产生了想要的正确结果:
2
<强> II。 XPath 2.0解决方案:
以下单个XPath 2.0表达式:
count(
for $f in /*/*,
$w in $f
[@ProgramCategory eq $pCountry
and
not($pFilteredStates/*
[contains($f/@Program, .)]
)
]
return $w
)
在同一XML文档(上图)上进行评估时,会生成所需的正确结果:
2