用于Linux CLI的XSLT 2.0处理器/ XSLT 1.0中的contains()函数

时间:2015-09-02 17:21:12

标签: xml linux xslt

这不是100%的编程问题,但我希望它适合这里。

你知道Linux(cli)的任何轻量级XSLT 2.0处理器吗?

xsltproc用于XSLT版本。仅限1.0。

我发现只有撒克逊处理器,但这个需要Java(我真的不想安装)。

或者,您能为我推荐一个针对contains()函数的XSLT v1解决方案吗?

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="@*|node()">
       <xsl:for-each select="offer[contains(lower-case(name),'find this one')]">
         <xsl:copy-of select="."/>
       </xsl:for-each>
    </xsl:template>

</xsl:transform>

1 个答案:

答案 0 :(得分:2)

我不知道这样的处理器,但通过使用translate函数替换lower-case函数,将样式表重新编码为1.0兼容是相对简单的,然后它会使用xsltproc

如果要选择符合条件的所有 offer元素(并且可能存在多个元素),则需要在它们周围包装单个根级元素所有:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
       <offers>
          <xsl:copy-of select="//offer[contains(
             translate(name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
             'find this one')]" />
       </offers>
    </xsl:template>

</xsl:transform>

如果您知道只有一个匹配商品,那么您不一定需要包装元素。