如何使用 XSL 在 XML 中找到所有唯一节点?
How can I find all the unique Node in my XML by using XSL?
您好,我是 xslt 转换方面的新手。我需要从我的输入中找到所有唯一节点(需要丢弃节点内所有字段与其他节点相同的节点)xml
我的输入xml是
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
我希望输出中的唯一节点为
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
我如何使用 xslt 1.0 实现这一点。我不能使用 xslt 2.0.
functx:distinct-deep函数根据节点是否深度相等来比较节点,然后returns只有第一个节点具有不同value.You才能使用下面的代码。
functx:distinct-deep($in-xml//ns7:LFULL-REC)
假设您通过正确的输入解决了您的问题,则以下内容将起作用。您需要将其扩展到任何您认为 "fields".
<xsl:stylesheet
xmlns:e="http://TargetNamespace.com/NewElement"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!-- your current code here, the part you didn't show, so you'll need
to adjust the rest to match whatever structure you already have -->
<xsl:key match="e:LFULL-REC" name="dupe" use="concat(e:MESSAGE-GROUP-ID, '-', e:FULL-TOTAL-MESSAGE-CNT)" />
<xsl:template match="e:LFULL-REC[generate-id(.) = generate-id(key('dupe', concat(e:MESSAGE-GROUP-ID, '-', e:FULL-TOTAL-MESSAGE-CNT)))]">
<xsl:copy>
<xsl:apply-templates select="node() |@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="e:LFULL-REC" />
</xsl:stylesheet>
这使用了Muenchian Grouping, named after the first person that came up with this idea. Google it, there are plenty tutorials and even a Wikipedia article on the subject.
终于可以改造成功了
我的输入xml是
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
我更新的 xslt 是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns7="http://TargetNamespace.com/NewElement">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key match="ns7:LFULL-REC" name="dupe" use="concat(ns7:MESSAGE-GROUP-ID, '-', ns7:FULL-TOTAL-MESSAGE-CNT,'-',ns7:FULL-MESSAGE-SERIAL-NO,'-',ns7:FULL-TRANSMITED-REC-CNT)" />
<xsl:template match="/">
<ns7:newElement>
<xsl:for-each select="ns7:newElement/ns7:LFULL-REC[generate-id(.) = generate-id(key('dupe', concat(ns7:MESSAGE-GROUP-ID, '-', ns7:FULL-TOTAL-MESSAGE-CNT,'-',ns7:FULL-MESSAGE-SERIAL-NO,'-',ns7:FULL-TRANSMITED-REC-CNT)))]">
<xsl:copy-of select="."/>
</xsl:for-each>
</ns7:newElement>
</xsl:template>
</xsl:stylesheet>
我的输出xml是
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
感谢@Abel 的宝贵意见
您好,我是 xslt 转换方面的新手。我需要从我的输入中找到所有唯一节点(需要丢弃节点内所有字段与其他节点相同的节点)xml
我的输入xml是
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
我希望输出中的唯一节点为
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
我如何使用 xslt 1.0 实现这一点。我不能使用 xslt 2.0.
functx:distinct-deep函数根据节点是否深度相等来比较节点,然后returns只有第一个节点具有不同value.You才能使用下面的代码。
functx:distinct-deep($in-xml//ns7:LFULL-REC)
假设您通过正确的输入解决了您的问题,则以下内容将起作用。您需要将其扩展到任何您认为 "fields".
<xsl:stylesheet
xmlns:e="http://TargetNamespace.com/NewElement"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!-- your current code here, the part you didn't show, so you'll need
to adjust the rest to match whatever structure you already have -->
<xsl:key match="e:LFULL-REC" name="dupe" use="concat(e:MESSAGE-GROUP-ID, '-', e:FULL-TOTAL-MESSAGE-CNT)" />
<xsl:template match="e:LFULL-REC[generate-id(.) = generate-id(key('dupe', concat(e:MESSAGE-GROUP-ID, '-', e:FULL-TOTAL-MESSAGE-CNT)))]">
<xsl:copy>
<xsl:apply-templates select="node() |@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="e:LFULL-REC" />
</xsl:stylesheet>
这使用了Muenchian Grouping, named after the first person that came up with this idea. Google it, there are plenty tutorials and even a Wikipedia article on the subject.
终于可以改造成功了
我的输入xml是
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
我更新的 xslt 是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns7="http://TargetNamespace.com/NewElement">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key match="ns7:LFULL-REC" name="dupe" use="concat(ns7:MESSAGE-GROUP-ID, '-', ns7:FULL-TOTAL-MESSAGE-CNT,'-',ns7:FULL-MESSAGE-SERIAL-NO,'-',ns7:FULL-TRANSMITED-REC-CNT)" />
<xsl:template match="/">
<ns7:newElement>
<xsl:for-each select="ns7:newElement/ns7:LFULL-REC[generate-id(.) = generate-id(key('dupe', concat(ns7:MESSAGE-GROUP-ID, '-', ns7:FULL-TOTAL-MESSAGE-CNT,'-',ns7:FULL-MESSAGE-SERIAL-NO,'-',ns7:FULL-TRANSMITED-REC-CNT)))]">
<xsl:copy-of select="."/>
</xsl:for-each>
</ns7:newElement>
</xsl:template>
</xsl:stylesheet>
我的输出xml是
<ns7:newElement xmlns:ns7="http://TargetNamespace.com/NewElement">
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>56201</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>22</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC>
<ns7:LFULL-REC>
<ns7:MESSAGE-GROUP-ID>7643</ns7:MESSAGE-GROUP-ID>
<ns7:FULL-TOTAL-MESSAGE-CNT>20</ns7:FULL-TOTAL-MESSAGE-CNT>
<ns7:FULL-MESSAGE-SERIAL-NO>1</ns7:FULL-MESSAGE-SERIAL-NO>
<ns7:FULL-TRANSMITED-REC-CNT>42</ns7:FULL-TRANSMITED-REC-CNT>
</ns7:LFULL-REC></ns7:newElement>
感谢@Abel 的宝贵意见