2012-06-11 4 views
0

Я хотел бы написать 4 вопроса о том, существуют они или нет. До сих пор мой подход состоял в том, чтобы выбрать = "// NTE_NotesAndCommentsSegment_2/NTE_3_Comment", который извлекает все 3 комментария. Но у меня возникли проблемы сXSLT Если Select содержит «Значение»

  1. Выбор NTE_3_Comment, где она содержит "Вопрос 1" (String Value)

  2. Выписывая Вопрос 4 когда вопрос не существует.

  3. Мне также нужно вывести правильное число для SETID.

Примечание: вопрос на самом деле не имеет номера в нем. Я использую идентификатор для сортировки вывода.

Входной XML:

<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>1</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 1 ? Answer 1</NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 
<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>1</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 2 ? Answer 2</NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 
<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>1</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 3? Answer 3</NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 

Ожидаемый результат XML:

<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>1</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 1 ? Answer 1</NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 
<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>2</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 2 ? Answer 2</NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 
<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>3</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 3 ? Answer 3</NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 
<NTE_NotesAndCommentsSegment_2> 
    <NTE_1_SetIdNotesAndComments>4</NTE_1_SetIdNotesAndComments> 
    <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
    <NTE_3_Comment>Question 4 ? *Blank* </NTE_3_Comment> 
</NTE_NotesAndCommentsSegment_2> 

Я ищу предложения, которые могут помочь мне изменить свой подход к этому решению. Заранее спасибо.

Решение: Благодаря предложению @ O.R.Mapper. Все четыре вопроса будут выписаны каждый раз, если вопрос существует или нет. Ответ будет отображаться пустым, если вопрос не существует в источнике.

  <NTE_NotesAndCommentsSegment_2> 
      <NTE_1_SetIdNotesAndComments>1</NTE_1_SetIdNotesAndComments> 
      <NTE_3_Comment>Question 1 ?<xsl:value-of select="substring-after(//NTE_NotesAndCommentsSegment_2/NTE_3_Comment[starts-with(text(),'Question 1')],'?')"/> 
      </NTE_3_Comment> 
      </NTE_NotesAndCommentsSegment_2> 

      <NTE_NotesAndCommentsSegment_2> 
      <NTE_1_SetIdNotesAndComments>2</NTE_1_SetIdNotesAndComments> 
      <NTE_3_Comment>Question 2 ?<xsl:value-of select="substring-after(//NTE_NotesAndCommentsSegment_2/NTE_3_Comment[starts-with(text(),'Question 2')],'?')"/> 
      </NTE_3_Comment> 
      </NTE_NotesAndCommentsSegment_2> 

      <NTE_NotesAndCommentsSegment_2> 
      <NTE_1_SetIdNotesAndComments>3</NTE_1_SetIdNotesAndComments> 
      <NTE_3_Comment>Question 3 ?<xsl:value-of select="substring-after(//NTE_NotesAndCommentsSegment_2/NTE_3_Comment[starts-with(text(),'Question 3')],'?')"/> 
      </NTE_3_Comment> 
      </NTE_NotesAndCommentsSegment_2> 

      <NTE_NotesAndCommentsSegment_2> 
      <NTE_1_SetIdNotesAndComments>4</NTE_1_SetIdNotesAndComments> 
      <NTE_3_Comment>Question 4 ? <xsl:value-of select="substring-after(//NTE_NotesAndCommentsSegment_2/NTE_3_Comment[starts-with(text(),'Question 4')],'?')"/> 
      </NTE_3_Comment> 
      </NTE_NotesAndCommentsSegment_2> 
+0

Что вы имеете в виду под «Выбор NTE_3_Comment где он содержит вопрос 1 "? –

+0

Я ищу конкретную строку. В этом примере я бы искал «Вопрос 1». –

+0

Поскольку это связано с картой Biztalk, это может помочь, если вы добавите исходную и целевую схему (части). У источника 'NTE_1_SetIdNotesAndComments' действительно всегда значение' 1'? – Filburt

ответ

0

Раствор для (1) будет следующее выражение XPath:

//NTE_NotesAndCommentsSegment_2/NTE_3_Comment[starts-with(text(), 'Question 1')] 
+0

Я думаю, что OP скорее ищет способ разделить текст элемента на часть вопроса перед «?» и часть ответа (после «?»), чем hardcoding текст в его xpath. – Filburt

+0

@ O.R.Mapper, ваше предложение указало мне в правильном направлении. 'substring-after (// NTE_NotesAndCommentsSegment_2/NTE_3_Comment [начинается с (text(), 'Question 1)],'? ')' Я поставлю полный ответ, когда я закончу решение. –

0

Комплексное решение XSLT может выглядеть следующим образом:

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

    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="root"> 
     <root> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i" select="1" /> 
       <xsl:with-param name="count" select="4" /> 
       <xsl:with-param name="answer" select="substring-after(//NTE_NotesAndCommentsSegment_2[position() = 1]/NTE_3_Comment, '?')" /> 
      </xsl:call-template> 
     </root> 
    </xsl:template> 

    <xsl:template name="for.loop"> 

     <xsl:param name="i" /> 
     <xsl:param name="count" /> 
     <xsl:param name="answer" /> 

     <xsl:if test="$i &lt;= $count"> 
      <NTE_NotesAndCommentsSegment_2> 
       <NTE_1_SetIdNotesAndComments> 
        <xsl:value-of select="$i" /> 
       </NTE_1_SetIdNotesAndComments> 
       <NTE_2_SourceOfComment></NTE_2_SourceOfComment> 
       <NTE_3_Comment> 
       <xsl:choose> 
        <xsl:when test="$answer = ''"> 
         <xsl:value-of select="concat('Question ', $i, ' ? *Blank*')" /> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="concat('Question ', $i, ' ? ', $comment)"/> 
        </xsl:otherwise> 
       </xsl:choose> 
       </NTE_3_Comment> 
      </NTE_NotesAndCommentsSegment_2> 
     </xsl:if> 

     <!-- Repeat the loop until finished --> 
     <xsl:if test="$i &lt;= $count"> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i" select="$i + 1" /> 
       <xsl:with-param name="count" select="$count"> 
       <xsl:with-param name="comment" select="substring-after(//NTE_NotesAndCommentsSegment_2[position() = $i + 1]/NTE_3_Comment, '?')" /> 
      </xsl:call-template> 
     </xsl:if> 

    </xsl:template> 

    <xsl:template match="/ | @* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Спасибо Filburt, Это решение выводит только ответ. Его важно, что я знаю, какой вопрос не существует, чтобы включить его в вывод. –

+0

Я обновил свой ответ, чтобы включить последовательность в вывод.Я немного смущен, что ваш xpath 'start-with (text(), 'Question X')' работает, поскольку вы сказали, что ваши фактические данные не содержат порядковый номер. – Filburt

+0

Правильно, я хотел остаться верным этому примеру и ответить на него правильно. Filburt он не содержит порядковый номер, но я знаю, что будет с 4 вопросами. «Цель экзамена? Годовой физический' начинается с подстроки цели? дает мне «Ежегодный физический». Также вопрос может возникнуть не в правильном порядке. Я должен выводить их в правильном порядке. Спасибо за ваше время Filburt –

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