Xml XSLT未在Shell脚本中编译
这是该问题的后续问题- 当使用在线XSLT测试工具()时,为该问题提供的解决方案会按预期工作。但是,当我将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
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处理器都有帮助。我认为最好问一个关于内存问题的新问题,或者,如果可以的话,尝试使用(需要许可证)之类的方法。