XSLT: проверить, существует ли файл, создать элемент - PullRequest
0 голосов
/ 02 декабря 2018

Я хотел бы попросить отладки в следующем 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 голосов
/ 02 декабря 2018

Если у вас есть шаблон для product элементов, выполняющих правильные задания преобразования, но вы хотите исключить некоторые элементы продукта из преобразования и вместо этого удалить их в результате преобразования, добавьте пустой шаблон

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

Для элемента xml вам не нужен какой-либо конкретный шаблон, так как шаблон преобразования идентификаторов, который у вас есть, сначала позаботится о нем, и вместе с вышеупомянутыми пустыми шаблонами гарантирует, что недоступные продукты не будут скопированы в выходные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...