XSLT未在Shell脚本

时间:2015-10-27 20:17:18

标签: xml shell xslt

这是此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>

非常感谢任何帮助。

2 个答案:

答案 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>