Измените содержимое одного узла в элементе с помощью XSL, копируя остальные - PullRequest
2 голосов
/ 27 июня 2011

У меня есть некоторый XML, который содержит достаточное количество атрибутов в каждом элементе, и иногда мне нужно отформатировать один или два атрибута, если выполняется какое-то условие.Я думал, что сделаю это с XSL.

Итак, внутри моего шаблона в файле XSL у меня есть следующее:

<xsl:choose>
  <xsl:when test="ytd &lt; 0.000000001 or interest &lt; 0.000000001">
    <xsl:element name="Report">
      <xsl:choose>
        <xsl:when test="ytd&lt; 0.000000001">
          <xsl:element name="ytd">0</xsl:element>
        </xsl:when>
        <xsl:when test="interest &lt; 0.000000001">
          <xsl:element name="interest">0</xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="." />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="." />
  </xsl:otherwise>
</xsl:choose>

Операции для полей YTD и интереса работают, как я ожидаюих, по существу, округление до нуля для меня.Проблема в другом пункте;Кажется, я неправильно понимаю, как использовать копию.Я хочу, чтобы остальные n атрибутов элемента Report были скопированы так, как они есть в исходном XML.Проблема в том, что с этим текущим шаблоном я получаю вывод, подобный следующему, для отчета с очень маленьким значением ytd:

<Report><ytd>0</ytd></Report>

Так что, очевидно, я неправильно копирую остальную часть элемента.Любые указатели?

РЕДАКТИРОВАТЬ: Пример XML-файла ввода может быть:

<Reports>
  <Report>
    <name>Bob</name>
    <account>Saver</account>
    <ytd>100</ytd>
    <interest>0.5</ytd>
    <cosigned>false</cosigned>
  </Report>
  <Report>
    <name>Steve</name>
    <account>Gold Account</account>
    <ytd>0.0000000001</ytd>
    <interest>0.0000000001</ytd>
    <cosigned>false</cosigned>
  </Report>
</Reports>

И желаемый результат будет:

<Reports>
  <Report>
    <name>Bob</name>
    <account>Saver</account>
    <ytd>100</ytd>
    <interest>0.5</ytd>
    <cosigned>false</cosigned>
  </Report>
  <Report>
    <name>Steve</name>
    <account>Gold Account</account>
    <ytd>0</ytd>
    <interest>0</ytd>
    <cosigned>false</cosigned>
  </Report>
</Reports>

(Очевидно, я просто издеваюсьэто, но, надеюсь, вы понимаете, о чем я)

Спасибо, Дейв.

1 Ответ

6 голосов
/ 27 июня 2011

Я думаю, что самый простой способ сделать то, что вы хотите, это:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ytd[ . &lt; 0.000000001 ] | interest[ . &lt; 0.000000001]">
        <xsl:copy>0</xsl:copy>
    </xsl:template>

</xsl:stylesheet>
  • Используйте правило идентификации (см. Первый шаблон выше), чтобы скопировать все как есть
  • Заменить элементы по мере необходимости
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...