разделить значение xml с xpath и проверить положение строки - PullRequest
5 голосов
/ 12 апреля 2011

У меня есть следующий xml-файл:

 <courses>
   <course>
    <name>Course 1</name>
    <code>00162</code>
    <questions>2,2,1,1,2,1,1,1</questions>
   </course>
   </courses>

Мне нужно запросить файл (я использую xpath), чтобы разделить элемент 'questions', проверить положение, в котором появляется каждое число, и проверитьесли это число 1 или 2.

В основном мне нужно это в xpath:

Dim ints As String() = QuestionsString.ToString.Split(",")
Dim i As Integer

        For i = 0 To UBound(ints)    
            If ints(i) = "2" Then
             'do something
            Else
            'do something else
            End If
        Next

Обновление из комментариев

Привет, благодарю вас.Я собирался редактировать вопрос, так как он был неверным.Я хочу получить, например, все названия курсов и коды, у которых элемент 'questions' (после разделения) имеет "2" во второй позиции, как в 1, 2 , 2,1,1,1, 2,1 Спасибо!

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

В XSLT 1.0 вы бы использовали рекурсивный шаблон для разделения строки.

Заимствование у @ Томалака ответ на аналогичный вопрос , является примером:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <!--Call the recursive template to split the string-->
        <xsl:call-template name="split">
            <xsl:with-param name="list" select="/courses/course/questions" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="split">
        <xsl:param name="list"      select="''" />
        <xsl:param name="separator" select="','" />
        <xsl:if test="not($list = '' or $separator = '')">
            <xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" />
            <xsl:variable name="tail" select="substring-after($list, $separator)" />

            <!--Use the parsed value to do something-->
            <xsl:call-template name="handleQuestion">
                <xsl:with-param name="value" select="$head"/>
            </xsl:call-template>

            <xsl:call-template name="split">
                <xsl:with-param name="list"      select="$tail" />
                <xsl:with-param name="separator" select="$separator" />
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="handleQuestion">
        <xsl:param name="value" />
        <xsl:choose>
            <xsl:when test="$value=2">
                <!--Do something-->
            </xsl:when>
            <xsl:otherwise>
                <!--Do something else-->
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

В XSLT 2.0 вы можете использовать функцию tokenize() :

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/">
        <xsl:for-each select="tokenize(/courses/course/questions,',')">
            <xsl:choose>
                <xsl:when test="number(.)=2">
                    <!--Do something-->
                </xsl:when>
                <xsl:otherwise>
                    <!--Do something else-->
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
1 голос
/ 12 апреля 2011
/courses
   /course[
      substring-before(
         substring-after(
            question,
            ','
         ),
         ','
      ) = 2
   ]/*[self::name|self::code]

Или

/courses
   /course[
      substring(question,3,1) = '2'
   ]/*[self::name|self::code]
0 голосов
/ 12 апреля 2011

Ну, в XPath tokenize(string, pattern), так что вы можете написать

/courses/course/questions[(tokenize(text(), "[0-9]+")) ]
                     put something clever here -------^

Но я не понимаю, что вы подразумеваете под «делать что-то» и «делать что-то еще». XPath для выбора узлов / получения информации. Вам нужно XSLT или XQuery, чтобы «сделать что-то» еще.

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