как установить новое значение для переменной или параметра в xsl - PullRequest
3 голосов
/ 02 апреля 2011

Мне нужна помощь по поводу xsl.У меня есть атрибут даты в исходном XML, и мне нужно знать его предыдущее значение, потому что мне нужно классифицировать в соответствии с датой.Вот исходный XML.

Исходный XML:

<root>
  <license id="a" expireDate="2010-02-01"/>
  <license id="b" expireDate="2010-02-01"/>
  <license id="c" expireDate="2010-02-01"/>
  <license id="d" expireDate="2010-02-04"/>
  <license id="e" expireDate="2010-02-04"/>
  <license id="f" expireDate="2010-02-12"/>
  <license id="g" expireDate="2010-02-12"/>
</root>

Мне нужно преобразовать это в

<licenses>
   <expDate value="2010-02-01">
      <license>a</license>
      <license>b</license>
      <license>c</license>
   </expDate>
   <expDate value="2010-02-04">
      <license>d</license>
      <license>e</license>
   </expDate>
   <expDate value="2010-02-12">
      <license>f</license>
      <license>g</license>
   </expDate>
</licenses>

На самом деле, я могу преобразовать исходный XML, который имеет другой форматот данного.Я прочитал несколько статей, но не смог найти способ сделать это.Как я могу сохранить предыдущее значение даты и проверить, отличается ли оно от текущего.

Спасибо

1 Ответ

5 голосов
/ 02 апреля 2011

Вы не можете изменить значение переменной в XSLT, но вам это не нужно. Следующая таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="byDate" match="license" use="@expireDate" />
    <xsl:template match="/">
        <licenses>
            <xsl:apply-templates />
        </licenses>
    </xsl:template>
    <xsl:template
        match="license[generate-id() = 
                       generate-id(key('byDate', @expireDate)[1])]">
        <expDate value="{@expireDate}">
            <xsl:apply-templates select="key('byDate', @expireDate)"
                mode="group" />
        </expDate>
    </xsl:template>
    <xsl:template match="license" mode="group">
        <license>
            <xsl:value-of select="@id" />
        </license>
    </xsl:template>
    <xsl:template match="license" />
</xsl:stylesheet>

Применяется к этому входу:

<root>
  <license id="a" expireDate="2010-02-01"/>
  <license id="b" expireDate="2010-02-01"/>
  <license id="c" expireDate="2010-02-01"/>
  <license id="d" expireDate="2010-02-04"/>
  <license id="e" expireDate="2010-02-04"/>
  <license id="f" expireDate="2010-02-12"/>
  <license id="g" expireDate="2010-02-12"/>
</root>

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

<licenses>
    <expDate value="2010-02-01">
        <license>a</license>
        <license>b</license>
        <license>c</license>
    </expDate>
    <expDate value="2010-02-04">
        <license>d</license>
        <license>e</license>
    </expDate>
    <expDate value="2010-02-12">
        <license>f</license>
        <license>g</license>
    </expDate>
</licenses>

Примечание: Ваш исходный XML был неправильно сформирован. Я переместил значение лицензии в атрибут id.

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