XSLT: вывести значение и не получить значение дочернего узла - PullRequest
0 голосов
/ 19 января 2019

У меня есть этот исходный XML:

<Book>
   <Title>Harry Potter</Title>
   <editorial>M<previous>Sort</previous></editorial>
   <languaje>ESP<previous>EU</previous></languaje>
   <nationality>ESP</nationality>
</Book>

Когда я использую функцию:

<languaje>
    <xsl:value-of select="Book/languaje"/>
</languaje>

Я получаю следующий вывод: ESPEU и вы хотите иметь только ESP.

Как удалить все значения из определенного узла <previous>?

Спасибо за все

1 Ответ

0 голосов
/ 19 января 2019

Ваше выражение

<xsl:value-of select="Book/languaje"/>

выделяет все текстовое содержимое элемента languaje, который содержит

  1. a text() узел и
  2. a *Элемент 1011 * с самим text() узлом
  3. и другим text() узлом

Возможно, вам нужны узлы text()[1] (1) и text()[2] (3).


Если вы можете использовать XSLT-2.0 или выше, вы можете просто сделать это, используя расширенную функциональность xsl:value (опционально с разделителем), которая может обрабатывать большечем одно значение одновременно:

<xsl:value-of select="Book/languaje/text()" />

Если вы ограничены XSLT-1.0 и, следовательно, XPath-1.0, xsl:value может обрабатывать только одно значение за один раз.Но у вас есть как минимум три возможности:

  1. Цикл по text() узлам languaje элементов:

    <xsl:for-each select="Book/languaje/text()">
        <xsl:value-of select="."/>
    </xsl:for-each>
    
  2. Применитьстандартный шаблон на всех languaje text() узлах:

    <xsl:apply-templates select="Book/languaje/text()" />
    
  3. Примените стандартный шаблон к элементу languaje в сочетании с пустым шаблоном для previous элемент:

      <xsl:apply-templates select="Book/languaje" />
    
    <!-- And on the template level the following -->  
    <xsl:template match="languaje/previous" />
    

Вывод всех трех подходов должен быть одинаковым:

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