如何计算XSLT中的动态xml节点?
在这种情况下,我希望根据每个节点顶部设置的条件计算返回的标记数 我有将近20个旗子,如下面的例子所示。我们不知道其中有多少是真的。如果标志为TRUE,则将返回自定义文本。我想知道归还的旗帜的数量。我尝试了许多使用变量的方法,但没有成功如何计算XSLT中的动态xml节点?,xml,dynamic,count,nodes,Xml,Dynamic,Count,Nodes,在这种情况下,我希望根据每个节点顶部设置的条件计算返回的标记数 我有将近20个旗子,如下面的例子所示。我们不知道其中有多少是真的。如果标志为TRUE,则将返回自定义文本。我想知道归还的旗帜的数量。我尝试了许多使用变量的方法,但没有成功 <!--CPSOR ALERT FLAG--> <xsl:if test="Person/PersonInfo/CPSORFlag ='true'"> <scope:PersonAlert&
<!--CPSOR ALERT FLAG-->
<xsl:if test="Person/PersonInfo/CPSORFlag ='true'">
<scope:PersonAlert>
<!--PersonAlerts.PersonAlertText-->
<scope:AlertText>
<xsl:text>CONV PER/SOFF</xsl:text>
</scope:AlertText>
</scope:PersonAlert>
</xsl:if>
<!--CERTASADULT ALERT FLAG-->
<xsl:if test="Person/PersonInfo/CertAsAdultFlag ='true'">
<scope:PersonAlert>
<!--PersonAlerts.PersonAlertText-->
<scope:AlertText>
<xsl:text>CERT ADULT</xsl:text>
</scope:AlertText>
</scope:PersonAlert>
</xsl:if>
<!--DECEASED ALERT FLAG-->
<xsl:if test="Person/PersonInfo/DeceasedFlag ='true'">
<scope:PersonAlert>
<!--PersonAlerts.PersonAlertText-->
<scope:AlertText>
<xsl:text>DECEASED</xsl:text>
</scope:AlertText>
</scope:PersonAlert>
</xsl:if>
会议室/会议室
成人证书
已故的
这是示例XML
假设您的XML是这样的:
<root>
<Person>
<PersonInfo>
<CPSORFlag>true</CPSORFlag>
</PersonInfo>
</Person>
<Person>
<PersonInfo>
<ConditonalReleaseFlag>true</ConditonalReleaseFlag>
</PersonInfo>
</Person>
<Person>
<PersonInfo>
<MissingFlag>true</MissingFlag>
</PersonInfo>
</Person>
</root>
真的
真的
真的
使用count()函数
或
在上面显示的过滤器中添加所有不同类型的标志
[CPSORFlag='true'或其他…]
这是一个经过验证的例子
编辑
考虑到您新粘贴的XML,此模板应该可以做到这一点
XML
<Person>
<PersonInfo>
<CPSORFlag>true</CPSORFlag>
<MissingFlag>true</MissingFlag>
<ConditonalReleaseFlag>true</ConditonalReleaseFlag>
</PersonInfo>
</Person>
真的
真的
真的
样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="java" version="1.0">
<xsl:output media-type="text/xml" method="xml"/>
<!-- Filters refdoc based on condition and data -->
<xsl:template match="/">
<xsl:apply-templates select="//PersonInfo"/>
</xsl:template>
<xsl:template match="PersonInfo">
<NumberOfFlags>
<xsl:value-of select="count(CPSORFlag[.='true']|MissingFlag[.='true']|ConditonalReleaseFlag[.='true'])"/>
</NumberOfFlags>
</xsl:template>
</xsl:stylesheet>
只需在count函数中添加一个带有|符号的新标志
<NumberOfFlags>
<xsl:value-of select="count(//Person/PersonInfo[CPSORFlag[.='true'] or CPSORFlag[.='true']])"/>
</NumberOfFlags>
CPSORFlag[.='true']| MissingFlag[.='true']一般问题的典型示例:您希望从相同的输入数据计算两个不同的结果。有几种方法 (a) 咬紧牙关,对输入进行两次处理。这是solytion james31rock选择的 (b) 与(a)相同,但尝试多次识别要计算的表达式,并将这些表达式的结果放入变量中,以避免重复计算 (c) 将第一次计算的结果放入变量中,并对该变量的结果执行第二次计算 我想我会倾向于按照(b)的思路做一些事情。这是XSLT 2.0——如果你付给我很多钱,我只做XSLT 1.0。另外,我假设像
Person/PersonInfo/CPSORFlag
这样的表达式都选择一个节点
<xsl:variable name="flags" select="Person/PersonInfo/(CPSORFlag, CertAsAdultFlag, DeceasedFlag, ....)"/>
<xsl:variable name="count" select="count($flags[.='true'])"/>
<xsl:apply-templates select="$flags[. = 'true']"/>
然后
会议室/会议室
成人证书
已故的
等
?在旗帜旁边还有其他信息吗?需要一些xml结构的知识我的新解决方案是否适合您?我看到你对迈克尔·凯的评论了。嗨,詹姆斯,现在还没起作用。我不知道为什么会这样。有没有办法,我可以通过电子邮件向您发送我正在使用的XSL?这样你就可以清楚地看到这个问题。因为这是一个很大的文件,我不能把它放在这里。谢谢你的回复。不幸的是,我仍然无法完成计数工作。每次我都会得到1的计数值。@Harshavardhanjasshi,我编辑了我的文章。如果我发布的不是你的XML,请提供你的XML。非常感谢你的回复,詹姆斯。嗨,詹姆斯。我已将示例XML附加为图像。请检查一下,如果您需要更多信息,请告诉我。再次感谢您的时间和帮助。@Harshavardhanjasshi我编辑了我的帖子。我提供的新样式表应该可以做到这一点。嗨,Michael。谢谢你的回复。我仍然无法让计数工作。下面是我在看了您的和James的示例后尝试的代码:-您似乎在计算与特定条件匹配的ArrayOfPersonInfo元素的数量,但您的输入中只有一个ArrayOfPersonInfo元素。真的,如果你不使用我给你的解决方案,你不能指望我告诉你为什么你的解决方案不起作用。先生,我对你的误解深表歉意。我尝试了你的解决方案,但它出现了错误。下面这行代码总是出错。请让我知道我是否应该改变一些东西,也许你没有注意到我说的它需要XSLT2.0处理器。如果不是,告诉我错误是什么可能会有所帮助。不,版本是正确的。。
<xsl:variable name="flags" select="Person/PersonInfo/(CPSORFlag, CertAsAdultFlag, DeceasedFlag, ....)"/>
<xsl:variable name="count" select="count($flags[.='true'])"/>
<xsl:apply-templates select="$flags[. = 'true']"/>
<xsl:template match="Person/PersonInfo/*" priority="5">
<scope:PersonAlert>
<!--PersonAlerts.PersonAlertText-->
<scope:AlertText>
<xsl:next-match/>
</scope:AlertText>
</scope:PersonAlert>
</xsl:template>
<xsl:template match="CPSORFlag" priority="4">CONV PER/SOFF</xsl:template>
<xsl:template match="CertAsAdultFlag" priority="4">CERT ADULT</xsl:template>
<xsl:template match="DeceasedFlag" priority="4">DECEASED</xsl:template>
etc