我想用以下XSLT代码进行调试。我的XSLT检查目录中的图像,然后根据该图像创建一个元素(如果存在)。
XSLT:
<xsl:stylesheet exclude-result-prefixes="xs fs" version="2.0" xmlns:fs="java.io.File" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- remove not available elements -->
<xsl:template match="xml">
<xsl:copy>
<xsl:for-each select="product[avail != 'No']">
<xsl:copy>
<xsl:copy-of select="@*|node()"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<!-- add extra images if exists $code_001.jpg, _002.jpg... -->
<!--example: <IMAGE1>test.com/0012307_001.jpg</IMAGE> -->
<!-- ls /home/hpapagaj/images/: 001230.jpg, 0012307_001.jpg etc. -->
<xsl:template match="product">
<xsl:copy>
<xsl:apply-templates />
<xsl:variable name="imageproductid" select="code" />
<xsl:for-each select="1 to 5">
<xsl:variable name="filename"
select="concat('/home/hpapagaj/images/',$imageproductid,'_00', ., '.jpg')" />
<xsl:if test="fs:exists(fs:new($filename))">
<xsl:element name="{concat('IMAGE', .)}">
<xsl:value-of select="concat('https://test.com/',tokenize($filename, '/')[last()])" />
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我的XML很简单:
<xml>
<product>
<code>001237</code>
<avail>Yes</avail>
<IMGURL>https://test.com/001237.jpg</IMGURL>
</product>
</xml>
自从我添加了过滤功能(删除了不可用的元素):
<!-- remove not available elements -->
<xsl:template match="xml">
<xsl:copy>
<xsl:for-each select="product[avail != 'No']">
<xsl:copy>
<xsl:copy-of select="@*|node()"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
...它停止工作了。我可以将这一部分移到另一个XSLT,但是我想一步就完成转换。
答案 0 :(得分:1)
如果您有一个用于product
元素的模板,它们可以完成正确的转换工作,但想从转换中排除一些产品元素,而将其从转换结果中删除,则添加一个空模板
<xsl:template match="product[avail = 'No']"/>
对于xml
元素,您不需要任何特定的模板,因为您首先要使用的身份转换模板会处理它,并与上述空模板一起确保不会将不可用的产品复制到输出中