Xml XSLT未在Shell脚本中编译

Xml XSLT未在Shell脚本中编译,xml,shell,xslt,Xml,Shell,Xslt,这是该问题的后续问题- 当使用在线XSLT测试工具()时,为该问题提供的解决方案会按预期工作。但是,当我将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-o

这是该问题的后续问题-

当使用在线XSLT测试工具()时,为该问题提供的解决方案会按预期工作。但是,当我将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"
以下是标题_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>


任何帮助都将不胜感激。

我认为XPath 1.0有一个怪癖,不允许在点
之后使用谓词,因此使用
current()
而不是点

或者,只需将否定条件放在空模板的匹配模式中:

考虑一个标准来删除重复记录,它符合大多数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>


工具支持的XSLT版本不同?而该样式表依赖于比您的
xsltproc
版本支持的版本更新的版本?当我尝试运行当前xslt进程(如上面的Martins fix建议所示)时,要处理的最后一个文件是一个非常大的文件(130万条记录)。Linux op会由于内存不足错误而终止进程。据我所知,xslt利用了DOM,因此即使我尝试使用Muenchen分组,内存占用也是一个问题。您是否同意,由于我正在尝试处理的输入xml文件的大小(130万),即使是Muenchen分组也无法解决此xslt过程的内存问题?感谢您的推荐,您的解决方案在我的较小文件上非常有效。不幸的是,我的大文件(130万条记录)收到内存不足错误。因此,我正在寻找处理该文件的替代方法。XSLT(至少1.0和2.0)处理XML输入文档的完整内存树表示,我认为XSLT处理器的实现者说,这样一个树的大小需要XML输入大小的四到五倍。我不知道您的机器有多少内存,也不知道xsltproc是否允许您分配比通常更多的内存,这对许多基于Java的XSLT处理器都有帮助。我认为最好问一个关于内存问题的新问题,或者,如果可以的话,尝试使用(需要许可证)之类的方法。