这是此stackoverflow问题的后续行动 - Remove Duplicate Record from XML file using XLST
使用在线XSLT测试工具(http://xslttest.appspot.com)时,为此问题提供的解决方案按预期工作。但是,当我将xslt实现为shell脚本时,我收到以下错误:
XPath error : Invalid expression
.[generate-id()=generate-id(key('DistinctEAN', @vchEAN)[1])]
^
compilation error: file titles_isbn.xsl line 15 element copy-of
xsl:copy-of : could not compile select expression '.[generate-id()=generate-id(key('DistinctEAN', @vchEAN)[1])]'
我不明白为什么xslt在XSLT在线测试工具中使用时工作正常,但在shell脚本格式中使用时却不行。 这是我的shell脚本:
#!/bin/sh
echo "Renaissance Duplicate Filter Removal Script Start...."
cd /var/process/renaissance/scripts
xsltproc titles_isbn.xsl /var/process/renaissance/extractedfiles/titles_isbn_test.xml -o /var/process/renaissance/rrin/titles_isbn_nodup.xml
echo "Renaissance Duplicate Filter Removal Script complete"
这是titles_isbn.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="DistinctEAN" match="z:row" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="RowsetSchema" use="@vchEAN" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="z:row" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="RowsetSchema" >
<xsl:copy-of select=".[generate-id()=generate-id(key('DistinctEAN', @vchEAN)[1])]"/>
</xsl:template>
</xsl:stylesheet>
非常感谢任何帮助。
答案 0 :(得分:1)
我认为XPath 1.0在点.
之后有一个不允许谓词的怪癖,所以使用current()
而不是点。
作为替代方案,只需将否定条件置于空模板的匹配模式中:
<xsl:template match="z:row[not(generate-id() = generate-id(key('DistinctEAN', @vchEAN)[1]))]" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="RowsetSchema"/>
答案 1 :(得分:1)
考虑使用标准Muenchian Grouping来删除重复记录,这些记录符合大多数XSLT 1.0处理器。
由于我不知道您的XML文档结构,请输入分组和匹配节点的占位符:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="DistinctEAN" match="[ENTERING MATCHING NODE]" use="@vchEAN" />
<!-- IdentityTransform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="[ENTER GROUPING NODE]">
<[ENTER GROUPING NODE]>
<xsl:for-each select="ENTER MATCHING NODE[generate-id()
= generate-id(key('DistinctEAN', @vchEAN)[1])]">
<[ENTER MATCHING NODE]>
<xsl:copy-of select="*"/>
</[ENTER MATCHING NODE]>
</xsl:for-each>
</[ENTERING GROUPING NODE]>
</xsl:template>
</xsl:stylesheet>