XSL 检查和输出具有重复元素值的节点
XSL checking and output Nodes that have Duplicate Elements Values
我目前正在尝试输出一个列表,其中包含所有具有重复元素值的节点。以下是我的来源 XML 和 XLS:
来源XML
<menu>
<game name="Alien Ambush (USA)" index="" image="">
<description>Alien Ambush (USA)</description>
<cloneof></cloneof>
<crc>34634E16</crc>
<manufacturer>Micro Distributors</manufacturer>
<year>1982</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
<game name="Alien Game (USA)" index="" image="">
<description>Alien Game (USA)</description>
<cloneof></cloneof>
<crc>34634E16</crc>
<manufacturer>-</manufacturer>
<year>19xx</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
<game name="Alien Invasion (USA)" index="" image="">
<description>Alien Invasion (USA)</description>
<cloneof></cloneof>
<crc>20679D78</crc>
<manufacturer>Programma Software</manufacturer>
<year>1979</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
<game name="Night Survival (USA)" index="" image="">
<description>Night Survival (USA)</description>
<cloneof></cloneof>
<crc>34634E16</crc>
<manufacturer>-</manufacturer>
<year>19xx</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
</menu>
期望输出
Alien Ambush (USA),34634E16
Alien Game (USA),34634E16
Night Survival (USA),34634E16
我目前正在使用以下 XLS,它可以工作,但它会忽略具有重复值的最终节点。
当前 XLS
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="game" >
<xsl:if test="(following::game[crc=current()/crc])">
<xsl:value-of select="@name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="crc"/>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当前输出
Alien Ambush (USA),34634E16
Alien Game (USA),34634E16
请注意,我实际上使用的是逗号,因为我会将其作为 csv 提供给 Excel 以根据 CRC 值进行排序。如果我也可以使用 XLS 对密钥进行排序,那就太好了。我也尝试输出到下面并应用下面的XLS按crc排序,但结果仍然相同。
输出
<game name="Alien Ambush (USA)">
<crc>34634E16</crc>
</game>
<game name="Alien Game (USA)">
<crc>34634E16</crc>
</game>
按 CRC 对 XLS 进行排序
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="game" >
<xsl:apply-templates>
<xsl:sort select="crc"/>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
如果有人能给我一些指导会很有帮助。我对 XLS 还是比较陌生。
怎么样:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/menu">
<xsl:for-each-group select="game" group-by="crc">
<xsl:sort select="crc" data-type="text" order="ascending"/>
<xsl:if test="count(current-group()) > 1">
<xsl:apply-templates select="current-group()"/>
</xsl:if>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="game">
<xsl:value-of select="@name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="crc"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我目前正在尝试输出一个列表,其中包含所有具有重复元素值的节点。以下是我的来源 XML 和 XLS:
来源XML
<menu>
<game name="Alien Ambush (USA)" index="" image="">
<description>Alien Ambush (USA)</description>
<cloneof></cloneof>
<crc>34634E16</crc>
<manufacturer>Micro Distributors</manufacturer>
<year>1982</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
<game name="Alien Game (USA)" index="" image="">
<description>Alien Game (USA)</description>
<cloneof></cloneof>
<crc>34634E16</crc>
<manufacturer>-</manufacturer>
<year>19xx</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
<game name="Alien Invasion (USA)" index="" image="">
<description>Alien Invasion (USA)</description>
<cloneof></cloneof>
<crc>20679D78</crc>
<manufacturer>Programma Software</manufacturer>
<year>1979</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
<game name="Night Survival (USA)" index="" image="">
<description>Night Survival (USA)</description>
<cloneof></cloneof>
<crc>34634E16</crc>
<manufacturer>-</manufacturer>
<year>19xx</year>
<genre>Shoot-'Em-Up</genre>
<rating>Other - NR (Not Rated)</rating>
<enabled>Yes</enabled>
</game>
</menu>
期望输出
Alien Ambush (USA),34634E16
Alien Game (USA),34634E16
Night Survival (USA),34634E16
我目前正在使用以下 XLS,它可以工作,但它会忽略具有重复值的最终节点。
当前 XLS
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="game" >
<xsl:if test="(following::game[crc=current()/crc])">
<xsl:value-of select="@name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="crc"/>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当前输出
Alien Ambush (USA),34634E16
Alien Game (USA),34634E16
请注意,我实际上使用的是逗号,因为我会将其作为 csv 提供给 Excel 以根据 CRC 值进行排序。如果我也可以使用 XLS 对密钥进行排序,那就太好了。我也尝试输出到下面并应用下面的XLS按crc排序,但结果仍然相同。
输出
<game name="Alien Ambush (USA)">
<crc>34634E16</crc>
</game>
<game name="Alien Game (USA)">
<crc>34634E16</crc>
</game>
按 CRC 对 XLS 进行排序
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="game" >
<xsl:apply-templates>
<xsl:sort select="crc"/>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
如果有人能给我一些指导会很有帮助。我对 XLS 还是比较陌生。
怎么样:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/menu">
<xsl:for-each-group select="game" group-by="crc">
<xsl:sort select="crc" data-type="text" order="ascending"/>
<xsl:if test="count(current-group()) > 1">
<xsl:apply-templates select="current-group()"/>
</xsl:if>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="game">
<xsl:value-of select="@name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="crc"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>