XSLT:检查文件是否存在,创建元素

时间:2018-12-02 12:52:35

标签: xml xslt

我想用以下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,但是我想一步就完成转换。

1 个答案:

答案 0 :(得分:1)

如果您有一个用于product元素的模板,它们可以完成正确的转换工作,但想从转换中排除一些产品元素,而将其从转换结果中删除,则添加一个空模板

<xsl:template match="product[avail = 'No']"/>

对于xml元素,您不需要任何特定的模板,因为您首先要使用的身份转换模板会处理它,并与上述空模板一起确保不会将不可用的产品复制到输出中