Xslt xsl中的动态多过滤器
问题是,对于其他xml循环,我可以获得n个状态 比如说,如果我从另一个xml中得到,与美国相关的州是弗吉尼亚州、德克萨斯州和佛罗里达州,那么美国的计数是2,如果我说与澳大利亚相关的州是墨尔本、悉尼和布里斯班,那么计数是1。我正在使用xsl 1.0。好问题,+1 我认为没有一个XPath 1.0表达式计算出想要的计数 这是一个XSLT 1.0解决方案:Xslt xsl中的动态多过滤器,xslt,Xslt,问题是,对于其他xml循环,我可以获得n个状态 比如说,如果我从另一个xml中得到,与美国相关的州是弗吉尼亚州、德克萨斯州和佛罗里达州,那么美国的计数是2,如果我说与澳大利亚相关的州是墨尔本、悉尼和布里斯班,那么计数是1。我正在使用xsl 1.0。好问题,+1 我认为没有一个XPath 1.0表达式计算出想要的计数 这是一个XSLT 1.0解决方案: foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State
foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$State4])
<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>
<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>
II。XPath 2.0解决方案:
foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$State4])
<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>
<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>
以下单个XPath 2.0表达式:
2
在同一个XML文档(如上)上进行计算时,生成所需的正确结果:
count(
for $f in /*/*,
$w in $f
[@ProgramCategory eq $pCountry
and
not($pFilteredStates/*
[contains($f/@Program, .)]
)
]
return $w
)
好问题,+1
我认为没有一个XPath 1.0表达式计算出想要的计数
这是一个XSLT 1.0解决方案:
foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$State4])
<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>
<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>
II。XPath 2.0解决方案:
foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$State4])
<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>
<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>
以下单个XPath 2.0表达式:
2
在同一个XML文档(如上)上进行计算时,生成所需的正确结果:
count(
for $f in /*/*,
$w in $f
[@ProgramCategory eq $pCountry
and
not($pFilteredStates/*
[contains($f/@Program, .)]
)
]
return $w
)
你在一个属性中有多个状态名的事实真的把它搞砸了,不是吗。你在一个属性中有多个状态名的事实真的把它搞砸了,不是吗。我尝试了xsl 1.0解决方案,它给了我5个计数,知道吗?@Jack:你要么改变了(可能没有注意到)XML文档和/或代码,或者您有一个非常有缺陷、不符合要求的XSLT处理器。我总是在发布解决方案之前测试它们。在本例中,9个XSLT处理器(XSLT1.0和XSLT2.0)产生完全相同的正确结果:
2
。MSXML3、MSXML4、.NET XslCompiledTransform、.NET XslTransform、Saxon 6.5.4、Saxon 9.1.5、AltovaXML(XML-SPY)、Altova XML for XSLT 2.0、XQSharp。你可以用这些XSLT处理器中的任何一个来检查和验证这个结果。我在这里试过,它显示了5,你能告诉我哪里出了问题吗?@Jack:不要使用这样的网站——当然它们有缺陷。我只得到这个错误:“对象不支持属性或方法‘transformNode’”——这意味着它们甚至不能启动转换。来吧,伙计,使用MSXML3.0(IE附带)和msxsl.exe命令实用程序。如果我可以拥有并使用9个以上的XSLT处理器,那么是什么阻止了您至少拥有这么多XSLT处理器?我们是专业人士——没有在线“蛋糕”…@Jack:我真的试着用FF来使用这个“蛋糕”——强烈建议不要使用它。我无法运行一个转换——比alpha状态更糟糕——完成F a I L。我尝试了xsl 1.0解决方案,它给了我5个数字,你知道吗?@Jack:你要么改变了XML文档和/或代码(可能没有注意到),要么你的XSLT处理器有缺陷,不符合要求。我总是在发布解决方案之前测试它们。在本例中,9个XSLT处理器(XSLT1.0和XSLT2.0)产生完全相同的正确结果:2
。MSXML3、MSXML4、.NET XslCompiledTransform、.NET XslTransform、Saxon 6.5.4、Saxon 9.1.5、AltovaXML(XML-SPY)、Altova XML for XSLT 2.0、XQSharp。你可以用这些XSLT处理器中的任何一个来检查和验证这个结果。我在这里试过,它显示了5,你能告诉我哪里出了问题吗?@Jack:不要使用这样的网站——当然它们有缺陷。我只得到这个错误:“对象不支持属性或方法‘transformNode’”——这意味着它们甚至不能启动转换。来吧,伙计,使用MSXML3.0(IE附带)和msxsl.exe命令实用程序。如果我可以拥有并使用9个以上的XSLT处理器,那么是什么阻止了您至少拥有这么多XSLT处理器?我们是专业人士——没有在线“蛋糕”…@Jack:我真的试着用FF来使用这个“蛋糕”——强烈建议不要使用它。我无法运行一个转换——比alpha状态更糟糕——完成fail。