Отличительные значения от xml, используя xsl - PullRequest
0 голосов
/ 04 января 2010

У меня есть xml как

 <categories>    
<category>
   <LOC>USA,UK,Spain  <LOC>
 </category>
    <category>
           <LOC>India,USA,China <LOC>
        </category>
          <categories>

Я не хочу получать США два раза, когда я показываю LOC

<xsl:value of select="$LOC/>

Я думал об использовании некоторой переменной

<xsl:variable name="ABC" select="set:distinct(//LOC)"/>
<xsl:value-of select="$ABC"/>

Но это не работает Любая идея, в чем может быть проблема

РЕДАКТИРОВАТЬ: извините, я отредактировал xml, я набрал его неправильно

Ответы [ 2 ]

4 голосов
/ 04 января 2010

Учитывая этот XML

<?xml version="1.0" encoding="UTF-8"?>
<categories>
    <category>
        <LOC>USA,UK,Spain  </LOC>
    </category>
    <category>
        <LOC>India,USA,China </LOC>
    </category>
</categories>

Вот таблица стилей XSLT2, которая будет делать то, что вы хотите

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:variable name="LOC">
        <xsl:for-each select="//LOC/text()">
            <xsl:for-each select="tokenize(current(),',')">
                <temp><xsl:value-of select="current()"/></temp>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:variable>
    <xsl:template match="/">
        <xsl:value-of select="distinct-values($LOC/*)"/>
    </xsl:template>
</xsl:stylesheet>

Сначала строится временное дерево (фрагмент документа), содержащее по одному элементу для каждого токена, а затем использует Different-values ​​() для удаления дубликатов. Я кодировал и проверял это в Oxygen / XML.

3 голосов
/ 04 января 2010

Функция EXSLT set:distinct работает с наборами узлов. Передаваемые ему строки не являются наборами узлов, поэтому эта функция не работает. Вернее, он работает отлично, но вы ожидаете от него необоснованного.

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

Если у вас есть контроль над форматом, вы должны использовать что-то вроде этого:

<categories>
  <category>
    <LOC>USA</LOC>
    <LOC>UK</LOC>
    <LOC>Spain</LOC>
  </category>
  <category>
    <LOC>India</LOC>
    <LOC>USA</LOC>
    <LOC>China</LOC>
  </category>
</categories>

Если бы вы указали формат ввода, set:distinct сработал бы просто так, как вы пытаетесь его использовать.

Если у вас нет этого контроля над форматом ввода, вы обнаружите, что XSLT действительно не подходит для манипулирования строками и токенизации (XSLT 2 более полезен, если у вас есть доступ к нему, как упоминал Джим Гаррисон в комментарий). Лучше всего прочитать XML в какую-то другую структуру и токенизировать содержимое элемента LOC и напрямую работать с результатами, чем пытаться сделать это в XSLT.

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