Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xslt计数同级_Xml_Xslt_Xpath_Count - Fatal编程技术网

Xml xslt计数同级

Xml xslt计数同级,xml,xslt,xpath,count,Xml,Xslt,Xpath,Count,我有一个样本: 我现在得到的是: option1: 1 option2: 3 option3: 0 option4: 4 option1: 0 option2: 3 option3: 0 option4: 4 option1: 0 option2: 0 option3: 0 option4: 4 option1: 0 option2: 0 option3: 0 option4: 4 您正在计算最新的A元素之后的所有C元素。这可以通过

我有一个样本:

我现在得到的是:

option1: 1 

option2: 3 

option3: 0 

option4: 4 

option1: 0 

option2: 3 

option3: 0 

option4: 4 

option1: 0 

option2: 0 

option3: 0 

option4: 4 

option1: 0 

option2: 0 

option3: 0 

option4: 4 

您正在计算最新的A元素之后的所有C元素。这可以通过一个键来完成,将所有此类C元素与相关的A元素分组

<xsl:key name="lookup" match="C" use="generate-id(preceding-sibling::A[1])" />
请注意,如果您希望“option1”而不是“yes,它是option1”,您可以执行
concat('option',在(@rename,'option'))之后的子字符串
,而不仅仅是
@rename

注意,如果您重新构建XML,这个问题可以简化。类似这样的情况会更好:

<Root>
    <A rename="yes,it is option 1">
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 2">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 3"/>
    <A rename="yes,it is option 4">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
        <C rename="no"/>
    </A>
</Root>

您正在计算最近的A元素之后的所有C元素。这可以通过一个键来完成,将所有此类C元素与相关的A元素分组

<xsl:key name="lookup" match="C" use="generate-id(preceding-sibling::A[1])" />
请注意,如果您希望“option1”而不是“yes,它是option1”,您可以执行
concat('option',在(@rename,'option'))之后的子字符串
,而不仅仅是
@rename

注意,如果您重新构建XML,这个问题可以简化。类似这样的情况会更好:

<Root>
    <A rename="yes,it is option 1">
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 2">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 3"/>
    <A rename="yes,it is option 4">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
        <C rename="no"/>
    </A>
</Root>

在XSLT2.0中,这变成了一个简单的分组问题,使用
xsl:for each group
指令

<xsl:template match="Root">
  <xsl:for-each-group group-starting-with="A" select="*">
    <xsl:if test="count(current-group()) != 1">
      <p>Option <xsl:value-of select="substring-after(current-group()[1]/@rename, 'option ')"/> = <xsl:value-of select="count(current-group())-1"/></p>        </xsl:if>
  </xsl:for-each-group>
</xsl:template>

选项=


在XSLT2.0中,这变成了一个简单的分组问题,使用
xsl:for each group
指令

<xsl:template match="Root">
  <xsl:for-each-group group-starting-with="A" select="*">
    <xsl:if test="count(current-group()) != 1">
      <p>Option <xsl:value-of select="substring-after(current-group()[1]/@rename, 'option ')"/> = <xsl:value-of select="count(current-group())-1"/></p>        </xsl:if>
  </xsl:for-each-group>
</xsl:template>

选项=



这是一个不使用XML的很好的例子。为什么在不给数据提供任何结构的情况下使用结构化格式?另外,您实际上没有在输入中尝试所显示的XSLT代码。我得到了您想要的大部分输出。请在您的问题中多加注意,如果您的代码和问题不符合要求,则无法帮助您xt讲述了两个不同的故事。我只想简化我的原始文件。这是一个不使用XML的很好的例子。当你不给数据提供任何结构时,为什么要使用结构化格式?另外,你实际上没有在输入中尝试显示XSLT代码。我得到了你想要的输出。请在你的问题中多加注意,如果您的代码和问题文本讲述了两个不同的故事,那么就不可能对您有所帮助。我只是想简化我的原始文件,但A和C元素不是父元素和子元素,它们只是兄弟姐妹,是的,我知道!我只是说,如果它们是父元素和子元素,那么编写XSLT代码就很容易了。是的,我对处理这些更困惑了兄弟关系但A和C元素不是父元素和子元素,它们只是兄弟元素,是的,我知道!我只是说,如果它们是父元素和子元素,编写XSLT将很容易。是的,我对处理这些兄弟关系更困惑。这似乎很有趣,我在哪里可以找到更多这样的示例?我学到了我所知道的所有东西关于一本书中的XSLT 2.0,来自Wrox的优秀XSLT 2.0程序员参考。非常感谢,这是一本XSLT 2.0程序员参考,第三版Michael Kay ISBN:978-0-7645-6909-8平装本960页2004年8月查看此标题的最新版本第四版是最新的,但是的,这是正确的书。(ISBN 978-0470192740)Amazon报告说这本书可以在Kindle上使用,你可以在www.wrox.com上查看它是否有其他格式。这似乎很有趣,我在哪里可以找到更多这样的例子?我从一本书中了解到有关XSLT 2.0的所有知识,优秀的XSLT 2.0程序员参考自wrox。哦,非常感谢,这是XSLT 2吗。《程序员参考》第三版迈克尔·凯ISBN:978-0-7645-6909-8平装本960页2004年8月查看本书的最新版本第四版是最新版本,但没错,这本书是对的。(ISBN 978-0470192740)亚马逊报告说,这本书可用于Kindle,你可以在www.wrox.com上查看它是否有其他格式。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes"/>
    <xsl:key name="lookup" match="C" use="generate-id(preceding-sibling::A[1])" />

    <xsl:template match="/Root">
        <xsl:apply-templates select="A[key('lookup', generate-id())]" />
    </xsl:template>

    <xsl:template match="A">
        <xsl:value-of select="concat(@rename, ': ', count(key('lookup', generate-id())) , '&#13;&#13;')" />
    </xsl:template>
</xsl:stylesheet> 
yes,it is option 1: 1

yes,it is option 2: 3

yes,it is option 4: 4
<Root>
    <A rename="yes,it is option 1">
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 2">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 3"/>
    <A rename="yes,it is option 4">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
        <C rename="no"/>
    </A>
</Root>
<xsl:template match="Root">
  <xsl:for-each-group group-starting-with="A" select="*">
    <xsl:if test="count(current-group()) != 1">
      <p>Option <xsl:value-of select="substring-after(current-group()[1]/@rename, 'option ')"/> = <xsl:value-of select="count(current-group())-1"/></p>        </xsl:if>
  </xsl:for-each-group>
</xsl:template>