Получить информацию в предыдущем теге с помощью xslt - PullRequest
0 голосов
/ 15 августа 2011

У меня трое с XML, который мне нужно преобразовать в xslt.

Вот мой XML

<Groups>
            <term>
                <Tag1>My system1</Tag1>
                <Tag2>yes</Tag2>
                <Tag3>new york</Tag3>
            </term>
            <term>
                <Tag1/>
                <Tag2>no</Tag2>
                <Tag3>chicago</Tag3>
            </term>     
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>ok</Tag2>
                <Tag3>paris</Tag3>
            </term>
            <term>
                <Tag1/>
                <Tag2>help</Tag2>
                <Tag3>london</Tag3>
            </term>
            <term>
                <Tag1/>
                <Tag2>cancel</Tag2>
                <Tag3>rome</Tag3>
            </term>
</Groups>

А вот мой желаемый вывод.

<Groups>
            <term>
                <Tag1>My system1</Tag1>
                <Tag2>yes</Tag2>
                <Tag3>new york</Tag3>
            </term>
            <term>
                <Tag1>My system1</Tag1>
                <Tag2>no</Tag2>
                <Tag3>chicago</Tag3>
            </term>
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>ok</Tag2>
                <Tag3>paris</Tag3>
            </term>
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>help</Tag2>
                <Tag3>london</Tag3>
            </term>
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>cancel</Tag2>
                <Tag3>rome</Tag3>
            </term>
</Groups>

Все, что нужно xslt, это заполнить пустые теги значением из предыдущих непустых тегов.

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Эта простая таблица стилей должна делать это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*[not(text())]">
    <xsl:copy>
      <xsl:value-of select="../preceding-sibling::*[*[text() and name()=name(current())]][1]/*[text() and name()=name(current())]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
1 голос
/ 15 августа 2011

Вы всегда можете использовать «предыдущую» ось для поиска соответствующего тега, который содержит содержит значение, например, preceding::Tag1[text()] [1].(выберите первый элемент Tag1, у которого есть дочерний текст, первым таким тегом будет предыдущий непустой тег, поскольку направление предыдущей оси - обратный порядок документов).Очистить

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