Ответы пользователя по тегу XSL & XSLT
  • Как исправить файл стиля xsl?

    @alexalexes
    Сложно сделать first- или last- специфичный выходной элемент, так как нельзя внятно получить значение position.
    Однако, можно воспользоваться таким костылем:
    1) Вывести запятую и перенос строки впереди очередного элемента VALUES, сохранив перенос после элемента.
    2) Закомментировать лишнюю запятую в запросе.
    То есть добиться такого вывода:
    INSERT INTO table (config, allowance, tablename) VALUES --,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Voltage', 3, 'number_actual')
    ;

    Правило:
    INSERT INTO table (config, allowance, tablename) VALUES --</xsl:text><xsl:apply-templates/>
        <xsl:text>;</xsl:text>
      </xsl:template>
      
      <xsl:template match="node()[@format]">
        <xsl:variable name="allowance" select="Allowance/@value"/>
       <xsl:text>,&#10;</xsl:text> <!-- Сюда добавлены запятая и перенос -->    
    <xsl:value-of select="concat('(', $apostrophe)"/>
        <xsl:for-each select="ancestor::*">
          <xsl:variable name="element" select="local-name()"/>
          <xsl:value-of select="$element"/>
          <xsl:if test="$element='Item'">
            <xsl:value-of select="concat('[@key=', $apostrophe, $apostrophe, @key, $apostrophe, $apostrophe, ']')"/>
          </xsl:if>
          <xsl:text>/</xsl:text>
        </xsl:for-each>
        <xsl:choose>
          <xsl:when test="starts-with(@format, 'N')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'number_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'F')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'float_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'D')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'decimal_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'string_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
      </xsl:template>
      <xsl:template match="text()"/>
    </xsl:stylesheet>
    Ответ написан
    Комментировать