Xml xslt空标记检查
我的结构如下:Xml xslt空标记检查,xml,xslt,saxon,Xml,Xslt,Saxon,我的结构如下: <?xml version="1.0" encoding="UTF-8"?> <Legs> <Leg> <LegNo>1</LegNo> <RaceInfo> <RaceNo>1</RaceNo> <Name/> <BaseDistance>2140</BaseDistance> &
<?xml version="1.0" encoding="UTF-8"?>
<Legs>
<Leg>
<LegNo>1</LegNo>
<RaceInfo>
<RaceNo>1</RaceNo>
<Name/>
<BaseDistance>2140</BaseDistance>
<StartMethod Code="A"/>
<StartTime>
<Hour>13</Hour>
<Minute>48</Minute>
</StartTime>
<Status>OpenForSell</Status>
<NumberOfStarts>10</NumberOfStarts>
</RaceInfo>
<Starts>
<Start>
<StartNo>1</StartNo>
<Horse>
<RegNo>578001020080423</RegNo>
<Name>Mino</Name>
</Horse>
<Driver>
<LicenseNo>29749</LicenseNo>
<FirstName>Hovel</FirstName>
<LastName>Helmen</LastName>
</Driver>
<Distance>2140</Distance>
<Scratched>false</Scratched>
<Ranking>2</Ranking>
</Start>
<Start>
<StartNo>2</StartNo>
<Horse>
<RegNo>578001020080121</RegNo>
<Name>Furderud Svarten</Name>
</Horse>
<Driver>
<LicenseNo>4290</LicenseNo>
<FirstName>Bjørn</FirstName>
<LastName>Humborstad</LastName>
</Driver>
<Distance>2140</Distance>
<Scratched>false</Scratched>
<Ranking/>
</Start>
</Starts>
</Leg>
</Legs>
当您最初调用getRanking模板时,不要这样做
<xsl:with-param name="structure" select="Starts" />
尝试这样做,以过滤掉没有排名的开始元素
<xsl:with-param name="structure" select="Starts/Start[Ranking != '']" />
由于结构元素不再包含开始元素,因此还必须将getRanking元素中的表达式简化如下:
<xsl:choose>
<xsl:when test="$structure[Ranking=$counter]/StartNo = $winner">
<xsl:value-of select="$structure[Ranking=$counter]/StartNo"/>
说到这里,我想知道您是否可以简化整个逻辑,在这里为每个循环使用xsl:for,而不是递归调用模板
<xsl:for-each select="Starts/Start[Ranking != '']">
<xsl:sort select="Ranking" />
<!-- existing code from getRanking template -->
如果您想在找到赢家后立即“中止”循环,您可以按如下方式构造它
<xsl:variable name="winnerRanking" select="Starts/Start[StartNo = $winner]/Ranking" />
<xsl:for-each select="Starts/Start[Ranking != ''][Ranking <= $winnerRanking]">
<xsl:sort select="Ranking" />
您的错误在[Ranking=$counter]
谓词中。在任何情况下,请包括调用getRanking
的模板,并包括示例的预期输出。添加了请求的信息。是的,问题在于Ranking=$计数器谓词。您提供的XSLT在语法上无效。我看不出它是如何产生你所建议的产出的。您的问题还不完整。当然您可以使用[number(Ranking)=$counter]
,但我从目前为止看到的代码中怀疑有一种方法可以简化您的整个方法。添加了更多的XML和XSLT,因此应该可以对其进行处理。是的,这是可能的。同时,为了得到预期的结果,我必须遵守一些“规则”。嗨,蒂姆C,谢谢你的帮助。是的,添加/Start[Ranking!=''帮助很大,效果很好。我还没有测试过你的简单版本(将来可能会)。我不能使用排序,因为XML中的顺序决定了我要创建的列表中的顺序。我曾经注意到,尽管排名等于“”的开头应该在列表中,因此我与提供商进行了交谈,以了解他们是否可以对XML文件进行一些更改。再次感谢您提供的所有帮助!
<xsl:for-each select="Starts/Start[Ranking != '']">
<xsl:sort select="Ranking" />
<!-- existing code from getRanking template -->
<xsl:variable name="winnerRanking" select="Starts/Start[StartNo = $winner]/Ranking" />
<xsl:for-each select="Starts/Start[Ranking != ''][Ranking <= $winnerRanking]">
<xsl:sort select="Ranking" />