XML真值计数器

XML真值计数器,xml,xslt,xpath,xquery,Xml,Xslt,Xpath,Xquery,我需要计算所有具有真实价值的ProductOwner。在我的例子中,我有一个真值,所以作为输出,我将得到数字1 以下是我的XML代码: <ClientList> <Client> <ProductOwner>true</ProductOwner> </Client> <Client> <ProductOwner>false</ProductOwner> </Cli

我需要计算所有具有真实价值的ProductOwner。在我的例子中,我有一个真值,所以作为输出,我将得到数字1

以下是我的XML代码:

<ClientList>
  <Client>
    <ProductOwner>true</ProductOwner>
  </Client>
  <Client>
    <ProductOwner>false</ProductOwner>
  </Client>
</ClientList>
<ClientList>
  <Client>
    <Number>1</Number>
  </Client>
</ClientList>

真的
假的
我想得到这样一个输出XML代码:

<ClientList>
  <Client>
    <ProductOwner>true</ProductOwner>
  </Client>
  <Client>
    <ProductOwner>false</ProductOwner>
  </Client>
</ClientList>
<ClientList>
  <Client>
    <Number>1</Number>
  </Client>
</ClientList>

1.
以下是我的XSL代码,但它不能正常工作:

<Number>
  <xsl:variable name="Number" select="substring(ProductOwner, 1, 4)" />
  <xsl:for-each select="ClientList/Client">
    <xsl:choose>
    <xsl:when test="(ClientList/Client/@ProductOwner)='true'">true</xsl:when>
    <xsl:otherwise>false</xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</Number>

真的
假的

对适当的
XQuery
表达式使用
count()
不是更容易吗

这将返回您需要的内容:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <ClientList>
            <Client>
               <Number>
                   <xsl:value-of select="count(/ClientList/Client/ProductOwner[text()='true'])"/>
               </Number>
            </Client>
        </ClientList>
    </xsl:template>
</xsl:stylesheet>



我认为xpath应该反映OP所指示的完整路径,因为在这种情况下,
ProductOwner
可能会显示为
Client
之外的其他元素的子元素。应该注意的是,基于运行给定XSLT xml的XPath或XSLT解释器,XPath函数的支持可能会受到限制。(我可能在这一点上吹毛求疵,但我个人一直试图弄明白为什么有些东西不起作用,结果却发现问题出在解释器,而不是xml上)。@Anthony True!你会发现我给出了很多答案,我告诉大家要尽可能具体-在大多数情况下,深度搜索是需要避免的。。。好吧,比方说,我只是在展示原则。。。