XSL查找具有相同名称的职位

时间:2019-03-11 20:06:44

标签: xml xslt xpath

我正在学习XSL和Xpath语法,但有一些小问题。我的目标是找出一系列产品的保修。此保修可能包含在“功能”或“选项”中。

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

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

到目前为止,我还没有遇到任何问题,我做了一个“ for-each”,可以逐一进行。但我无法提取句子的编号,例如:

保修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 个答案:

答案 0 :(得分:1)

要从字符串“ 1年保修”中获取数字,可以采用以下几种方法:

使用translate函数:

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

内部调用将删除字符串中的所有字符,仅产生数字,而外部调用将从字符串中删除除内部函数返回的数字以外的所有其他字符。

或者您可以使用substring-beforesubtring-after

substring-before(substring-after(., 'warranty of '), ' ')

答案 1 :(得分:0)

怎么样:

<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>

对不起,我错过了“提取号码”部分。使用Ayoub_B解释的双translate()方法。

答案 2 :(得分:-1)

除了样式表还有其他问题,请替换

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

还有

<xsl:value-of select="substring-before(substring-after(.,'Garantía de '),' meses')"/>