Xml 从相似节点中选择一个节点
我试着搜索,但结果是空的。看起来很简单,但我被卡住了 基本上,我有记录,我使用了明钦族分组,但我只需要选择一个或另一个 如下例所示:我只希望ID出现一次,名称为-Blue。下面的示例应选择蓝色的ID 1234,并忽略名称为红色的其他ID 1234。与最后一个ID 5555相同。位置可能是随机的。最重要的是,我需要把它也放在一个CSV格式 当我在ID上应用Muenchian分组时,在尝试 任何帮助都将不胜感激Xml 从相似节点中选择一个节点,xml,xslt,xpath,Xml,Xslt,Xpath,我试着搜索,但结果是空的。看起来很简单,但我被卡住了 基本上,我有记录,我使用了明钦族分组,但我只需要选择一个或另一个 如下例所示:我只希望ID出现一次,名称为-Blue。下面的示例应选择蓝色的ID 1234,并忽略名称为红色的其他ID 1234。与最后一个ID 5555相同。位置可能是随机的。最重要的是,我需要把它也放在一个CSV格式 当我在ID上应用Muenchian分组时,在尝试 任何帮助都将不胜感激 <Table> <Record> <ID>1
<Table>
<Record>
<ID>1234</ID>
<Name>Blue</Name>
<Status>Available</Status>
<Number>111111</Number>
</Record>
<Record>
<ID>1234</ID>
<Name>Red</Name>
<Status>Available</Status>
<Number>212121</Number>
</Record>
<Record>
<ID>2222</ID>
<Name>Hazel</Name>
<Status>Available</Status>
<Number>4424233</Number>
</Record>
<Record>
<ID>3333</ID>
<Name>Purple</Name>
<Status>Available</Status>
<Number>23234</Number>
</Record>
<Record>
<ID>4444</ID>
<Name>Brown</Name>
<Status>Available</Status>
<Number>76567567</Number>
</Record>
<Record>
<ID>5555</ID>
<Name>Green</Name>
<Status>Available</Status>
<Number>3456356</Number>
</Record>
<Record>
<ID>5555</ID>
<Name>Blue</Name>
<Status>Available</Status>
<Number>324342</Number>
</Record>
1234
蓝色
可用
111111
1234
红色
可用
212121
2222
榛子
可用
4424233
3333
紫色
可用
23234
4444
棕色的
可用
76567567
5555
绿色
可用
3456356
5555
蓝色
可用
324342
输出应为:
<Table>
<Record>
<ID>1234</ID>
<Name>Blue</Name>
<Status>Available</Status>
<Number>111111</Number>
</Record>
<Record>
<ID>2222</ID>
<Name>Orange</Name>
<Status>Available</Status>
<Number>4424233</Number>
</Record>
<Record>
<ID>3333</ID>
<Name>Silver</Name>
<Status>Available</Status>
<Number>23234</Number>
</Record>
<Record>
<ID>4444</ID>
<Name>Blue</Name>
<Status>Available</Status>
<Number>76567567</Number>
</Record>
<Record>
<ID>5555</ID>
<Name>Blue</Name>
<Status>Available</Status>
<Number>3456356</Number>
</Record>
1234
蓝色
可用
111111
2222
橙色
可用
4424233
3333
银币
可用
23234
4444
蓝色
可用
76567567
5555
蓝色
可用
3456356
更新:我找到了一种方法,可以使用Muenchian分组进行w/o操作,特别适用于这种情况。但我想知道是否有更好的方法来进行这项工作,以及慕尼黑分组是否可行。我遇到的Muenchian分组的问题是确定分组的哪个阶段在本例中是第一次还是第二次
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Table">
<xsl:text>IDNumber,Name,Status,Number</xsl:text>
<xsl:text>
</xsl:text>
<xsl:for-each select="Record">
<xsl:choose>
<xsl:when test="ID = following-sibling::Record[1]/ID and Name = 'Blue'">
<xsl:value-of select="ID"/><xsl:text>,</xsl:text>
<xsl:value-of select="Name"/><xsl:text>,</xsl:text>
<xsl:value-of select="Status"/><xsl:text>,</xsl:text>
<xsl:value-of select="Number"/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="ID = following-sibling::Record[1]/ID and Name != 'Blue' and following-sibling::Record[1]/Name != 'Blue'">
<xsl:value-of select="ID"/><xsl:text>,</xsl:text>
<xsl:value-of select="Name"/><xsl:text>,</xsl:text>
<xsl:value-of select="Status"/><xsl:text>,</xsl:text>
<xsl:value-of select="Number"/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="ID = following-sibling::Record[1]/ID and Name !='Blue'">
<xsl:value-of select="following-sibling::Record[1]/ID"/><xsl:text>, </xsl:text>
<xsl:value-of select="following-sibling::Record[1]/Name"/><xsl:text>,</xsl:text>
<xsl:value-of select="following-sibling::Record[1]/Status"/><xsl:text>,</xsl:text>
<xsl:value-of select="following-sibling::Record[1]/Number"/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="ID != preceding-sibling::Record[1]/ID">
<xsl:value-of select="ID"/><xsl:text>,</xsl:text>
<xsl:value-of select="Name"/><xsl:text>,</xsl:text>
<xsl:value-of select="Status"/><xsl:text>,</xsl:text>
<xsl:value-of select="Number"/>
<xsl:text>
</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
IDNumber、Name、Status、Number
;
,
,
,
;
,
,
,
;
,
,
,
;
,
,
,
;
如果我理解正确,这应该适合您
XSLT1.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="records-by-id" match="Record" use="ID" />
<xsl:template match="/Table">
<!-- HEADER -->
<xsl:text>IDNumber,Name,Status,Number </xsl:text>
<!-- FOR EACH DISTINCT ID: -->
<xsl:for-each select="Record[count(. | key('records-by-id', ID)[1]) = 1]">
<!-- TAKE THE RECORDS IN CURRENT GROUP ... -->
<xsl:for-each select="key('records-by-id', ID)">
<!-- .. SORT THEM BY "BLUENESS" ... -->
<xsl:sort select="Name='Blue'" data-type="text" order="descending"/>
<!-- ... AND OUTPUT THE FIRST RECORD IN THE (SORTED) GROUP -->
<xsl:if test="position()=1">
<xsl:call-template name="row"/>
</xsl:if>
</xsl:for-each>
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="row">
<xsl:for-each select="*">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
你能提供一个更好的要求表述吗?这个例子很小,您自己的解决方案也很混乱。让我看看是否可以更清楚一点:如果存在两个相同的ID,我需要保留名为='Blue'的节点。相同的节点相邻,但包含“蓝色”的节点可以位于第一个或第二个匹配ID中。如果只有一个唯一的ID存在,我就保留它。是否可以将其重新表述为:对于每个唯一的ID,只输出一个节点;如果一个(或多个?)节点为蓝色,则输出该节点(或其中的第一个节点)。您好,谢谢。是的,这就是我想做的,但是被分类之类的东西卡住了。所以我结束了我发布的内容,但我更喜欢这个!
IDNumber,Name,Status,Number
1234,Blue,Available,111111
2222,Hazel,Available,4424233
3333,Purple,Available,23234
4444,Brown,Available,76567567
5555,Blue,Available,324342