Получение значений тегов после xsl: for-each

У меня есть следующий XML:

<Order>
  <jobDetails>
    <Question>
      <QuestionNumber>1</QuestionNumber>
      <QuestionResponse>
        <Response>Value</Response>
      </QuestionResponse>
    </Question>
    <Question>
      <QuestionNumber>2</QuestionNumber>
      <QuestionResponse>
        <Response>AnotherValue</Response>
      </QuestionResponse>
    </Question>
  </jobDetails>
</Order>

Я использую XSLT 1.0, чтобы получить значение ответа, если номер вопроса равен 2: мне нужно дополнительно запросить его и вывести другое значение в зависимости от него.

Я пробовал это:

<xsl:template match="Order">
  <xsl:for-each select="jobDetails/Question">
    <xsl:variable name="theSet" select="QuestionNumber[string(.)='2']" />
    <xsl:if test="$theSet">
      <xsl:when test="QuestionResponse/Response = 'Value'"><Response>SomeValue</Response></xsl:when> 
      <xsl:when test="QuestionResponse/Response = 'AnotherValue'"><Response>SomeOtherValue</Response></xsl:when>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

... но XSLT не проверяет.

Спасибо заранее за любую помощь.


person GarlicBread    schedule 11.01.2016    source источник
comment
Есть ли только один вопрос №2 во всем XML?   -  person michael.hor257k    schedule 12.01.2016


Ответы (1)


Похоже, вы усложняете это дело, чем должно быть. Если вы хотите проверить ответ на вопрос № 2, вы можете сделать это напрямую, не задавая все остальные вопросы:

<xsl:template match="/Order">
    <xsl:variable name="resp2" select="jobDetails/Question[QuestionNumber='2']/QuestionResponse/Response" />
    <response>
        <xsl:choose>
            <xsl:when test="$resp2='Value'">SomeValue</xsl:when>
            <xsl:when test="$resp2='AnotherValue'">SomeOtherValue</xsl:when>
        </xsl:choose>
    </response>
</xsl:template>

Обратите внимание, что это предполагает, что во всем XML есть только один Вопрос №2 (вы не ответили на мой вопрос по этому поводу). В противном случае нам потребовались бы инструкции, как вывести более одного результата.

person michael.hor257k    schedule 11.01.2016
comment
Спасибо за это. Я не знал, что таким образом можно писать отборные. К сожалению, похоже, что это не работает - я печатаю значение resp2, и оно пустое. Мне интересно, имеет ли это какое-либо отношение к совпадению с шаблоном, поскольку тег ‹jobDetails› находится в дополнительном наборе тегов ‹Order›. Я использую ‹xsl: template match = Order› на более высоком уровне. - person GarlicBread; 12.01.2016
comment
@GarlicBread Да, вышеупомянутое предполагает, что jobDetails является корневым элементом вашего XML. Пожалуйста, отредактируйте свой вопрос и покажите нам минимальный, но полный пример вашего XML и ожидаемого результата. - person michael.hor257k; 12.01.2016
comment
Готово, с извинениями. - person GarlicBread; 12.01.2016
comment
Отлично работает - большое спасибо. Да, в исходном XML есть только один вопрос 2. - person GarlicBread; 13.01.2016