Рассмотрим схему:Как перебрать список 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 как несколько элементов. Что мне не хватает?
Спасибо Майкл. Теперь я вижу ваш ответ в http://stackoverflow.com/questions/7725581/how-do-i-find-the-number-of-elements-in-a-xslist-using-xslt, который должен был мне вникнуть! – eisenpony