Xslt xsl中的动态多过滤器

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

问题是,对于其他xml循环,我可以获得n个状态

比如说,如果我从另一个xml中得到,与美国相关的州是弗吉尼亚州、德克萨斯州和佛罗里达州,那么美国的计数是2,如果我说与澳大利亚相关的州是墨尔本、悉尼和布里斯班,那么计数是1。我正在使用xsl 1.0。

好问题,+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
      )
好问题,+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。