XSL найти позицию с тем же именем - PullRequest
0 голосов
/ 11 марта 2019

Я изучаю синтаксис XSL и Xpath, и у меня возникли небольшие проблемы. Моя цель - узнать гарантию на серию продуктов. Эта гарантия может содержаться в «функциях» или «опциях».

<features>
<linea> asdasd </linea>
<linea> warranty of 9 moths </linea>
</features> 

<opcion>
<linea> warranty of 1 year </linea>
</opcion>

Пока у меня нет проблем, я сделал «для каждого», и я могу пройти через каждую. но я не могу извлечь номер предложения Например:

гарантия 1 год (мне нужно извлечь номер этого предложения)

Вы можете мне помочь?

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="tienda4.xsl" type="text/xsl" ?>
<tienda>
  <nombre>La tiendecilla</nombre>
  <telefono>953 87 12 23</telefono>
  <url etiqueta="URL: ">http://www.tiendecilla.es</url>
  <producto>
    <codigo>92</codigo>
    <cantidad>10</cantidad>
    <articulo>Radio-Casette</articulo>
    <seccion>Electrónica</seccion>
    <marca>Sanyo</marca>
    <modelo>MKJ-800</modelo>
    <caracteristicas>
      <linea>Auto-reverse</linea>
      <linea>Dolby-sorround</linea>
      <linea>Doble pletina</linea>
      <linea>Ecualizador de cinco bandas</linea>
      <linea>Garantía de 9 meses.</linea>
    </caracteristicas>
    <precio moneda="euro">90</precio>
  </producto>
  <producto>
    <codigo>103</codigo>
    <cantidad>50</cantidad>
    <articulo>Reloj Cocina</articulo>
    <seccion>Electrónica</seccion>
    <marca>Kenwood</marca>
    <modelo>Blue ONE</modelo>
    <caracteristicas>
      <linea>Varios diseños</linea>
    </caracteristicas>
    <opciones nombre="color" tipo="unica">
      <opcion valor="rojo"/>
      <opcion valor="azul"/>
      <opcion valor="blanco"/>
    </opciones>
    <opciones nombre="forma" tipo="unica">
      <opcion valor="cuadrado"/>
      <opcion valor="triangular"/>
      <opcion valor="redondo"/>
      <linea>Garantía de 6 meses.</linea>
    </opciones>
    <precio moneda="euro">12</precio>
  </producto>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="tienda">
    <html>
    <head>
    </head>
      <body>
      <h2>Tabla de tiendas</h2>
       <table border="1">
        <tr bgcolor="#9acd32">
        <th>Sección</th>
        <th>Articulo</th>
        <th>Marca</th>
        <th>Modelo</th>
        <th>Garantia</th>
        </tr>
         <xsl:for-each select="producto">
         <tr>
          <td><xsl:value-of select="seccion"/></td>
          <td><xsl:value-of select="articulo"/></td>
          <td><xsl:value-of select="marca"/></td>
          <td><xsl:value-of select="modelo"/></td>
          <td>
            <xsl:for-each select="caracteristicas"> 
            <xsl:if test="contains(., 'Garantía')">
            <xsl:value-of select="linea"/> (this only show me the first line, not who's contains the warranty)
            </xsl:if>
          </xsl:for-each>
          </td>
        </tr>
      </xsl:for-each>
      </table>
      </body>    
    </html>
  </xsl:template>
</xsl:stylesheet>

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Чтобы получить число из строки «гарантия 1 года», вы можете сделать это двумя способами:

Используя функцию translate :

translate(., translate(.,'0123456789',''), '')

внутренний вызов удалит все символы из строки и выдаст только цифры, внешний вызов удалит любые другие символы из строки, кроме чисел, которые вернула внутренняя функция.

Или вы можете использовать подстрока до и подстрока :

substring-before(substring-after(., 'warranty of '), ' ')
0 голосов
/ 11 марта 2019

Как насчет:

<xsl:for-each select="producto">
    <tr>
        <td>
            <xsl:value-of select="seccion"/>
        </td>
        <td>
            <xsl:value-of select="articulo"/>
        </td>
        <td>
            <xsl:value-of select="marca"/>
        </td>
        <td>
            <xsl:value-of select="modelo"/>
        </td>
        <td>
            <xsl:value-of select="(caracteristicas/linea | opciones/linea)[contains(., 'Garantía')]"/> 
        </td>
    </tr>
</xsl:for-each>

Извините, я пропустил часть "номер извлечения". Используйте метод double translate(), как объяснено Ayoub_B.

0 голосов
/ 11 марта 2019

Кроме того, есть другие проблемы с вашей таблицей стилей, замените

<xsl:value-of select="linea"/>

* ти * 1004

<xsl:value-of select="substring-before(substring-after(.,'Garantía de '),' meses')"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...