2015-05-12 2 views
0

Рассмотрим схему:Как перебрать список xs: list?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="TheList"> 
     <xs:simpleType> 
      <xs:list itemType="xs:string" /> 
     </xs:simpleType> 
    </xs:element> 
</xs:schema> 

И в XML:

<TheList> 
    This list has 5 values. 
</TheList> 

Как я могу итерацию по каждому из слов в списке? Для того, чтобы создать что-то вроде:

<item>This</item> 
<item>list</item> 
<item>has</item> 
<item>5</item> 
<item>values.</item> 

Основываясь на ответах, которые я нашел here и here, я должен сделать что-то вроде:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="TheList"> 
     <xsl:for-each select="tokenize(., ' ')"> 
      <item><xsl:value-of select="." /></item> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Однако, по крайней мере, в XML-шпион Altova, я подвожу это ошибка:

Wrong occurrence to match required sequence type: The supplied sequence ('5' item(s)) has the wrong occurrence to match the sequence type xs:string ('zero or one')

Используя встроенный отладчик, я был в состоянии определить, что ошибка возникает при вызове разметить на элемент, который был объявлен как список xs:. Это имеет смысл, поскольку элемент уже должен быть разделен в соответствии с правилами относительно xs: list. Для меня это наводит на мысль:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="TheList"> 
     <xsl:for-each select="."> 
      <item><xsl:value-of select="." /></item> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Однако это относится список как один элемент и не создает новый элемент элемента для каждого слова.

Кажется, что команда for-each обрабатывает список xs: как один элемент, в то время как функция tokenize обрабатывает один и тот же список xs: list как несколько элементов. Что мне не хватает?

ответ

1

Если вы используете преобразование, ориентированное на схему, то вам не нужно токенизировать значение самостоятельно - процесс атомизации делает это для вас автоматически.

<xsl:template match="TheList"> 
    <xsl:for-each select="data(.)"> 
     <item><xsl:value-of select="." /></item> 
    </xsl:for-each> 
</xsl:template> 

Если вы хотите, чтобы код работал в обеих схемах, известны и без схемы-Aware среды вы можете написать

<xsl:template match="TheList"> 
    <xsl:for-each select="tokenize(string(.), ' ')"> 
     <item><xsl:value-of select="." /></item> 
    </xsl:for-each> 
</xsl:template> 
+0

Спасибо Майкл. Теперь я вижу ваш ответ в http://stackoverflow.com/questions/7725581/how-do-i-find-the-number-of-elements-in-a-xslist-using-xslt, который должен был мне вникнуть! – eisenpony

Смежные вопросы