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())) , ' ')" />
</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>