XSLT - при использовании copy-of игнорируется утверждение «если» в шаблоне - PullRequest
2 голосов
/ 21 мая 2011

Сегодня я отправил еще один запрос о включении тегов, которые применяются к различным шаблонам, и я получил несколько ответов, которые помогли мне получить желаемый результат.Теперь у меня есть еще одна маленькая деталь, которую нужно решить.Мой XML выглядит так:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <account>
        <name>accountA</name>
    </account>
    <period>
        <type>priormonth</type>
        <balance>0.0000</balance>
    </period>
    <period>
        <type>currentmonth</type>
        <balance>20.0000</balance>
    </period>
    <account>
        <name>accountB</name>
    </account>
    <period>
        <type>priormonth</type>
        <balance>30.0000</balance>
    </period>
    <period>
        <type>currentmonth</type>
        <balance>0.0000</balance>
    </period>
</root>

Мой XSLT выглядит следующим образом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/root">
        <xsl:apply-templates select="account"/>
</xsl:template>

<xsl:template match="account">
    <xsl:copy>
        <xsl:copy-of select="name" />
        <perioddata>
            <xsl:copy-of select="following-sibling::period[position()&lt;=2]" />
        </perioddata>
    </xsl:copy>
</xsl:template>

<xsl:template match="period">
    <period>
    <type> <xsl:value-of select="type"/> </type>
    <balance>
    <xsl:if test="balance != 0">
        <xsl:value-of select="balance"/>
    </xsl:if>
    </balance>
    </period>
</xsl:template>

</xsl:stylesheet>

Это дает следующий вывод:

<account>
  <name>accountA</name>
  <perioddata>
      <period>
          <type>priormonth</type>
          <balance>0.0000</balance>
      </period>
      <period>
          <type>currentmonth</type>
          <balance>20.0000</balance>
      </period>
   </perioddata>
</account>
<account>
  <name>accountB</name>
  <perioddata>
      <period>
          <type>priormonth</type>
          <balance>30.0000</balance>
      </period>
      <period>
          <type>currentmonth</type>
          <balance>0.0000</balance>
      </period>
   </perioddata>
</account>

Этот вывод в порядке, за исключением того, чтоЯ хочу, чтобы мои строки с:

<balance>0.0000</balance>

выглядели так:

<balance/>

Извинения за любые опечатки выше ... Я в основном просто печатал, а не вырезал / вставил.Я читал, что «copy-of» может совпадать с «value-of» и выводить текст, что может объяснить, почему предложение «if» не распознает нулевое значение.Я пытался сделать:

<xsl:if test="number(balance) != 0">

, но все равно не получил желаемых результатов.Спасибо.

1 Ответ

3 голосов
/ 21 мая 2011

Попробуйте изменить

<xsl:copy-of select="following-sibling::period[position()&lt;=2]" />

на

<xsl:apply-templates select="following-sibling::period[position()&lt;=2]" />

Ваш шаблон "period" не используется, поскольку узлы используются шаблоном "root".

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