2012-06-11 87 views
0

我想寫出4個問題,不管它們是否存在。到目前爲止,我的方法是select =「// NTE_NotesAndCommentsSegment_2/NTE_3_Comment」,它檢索所有3條評論。但我有XSLT如果選擇包含「值」

  1. 麻煩選擇NTE_3_Comment其含有「問題1」(字符串值)

  2. 寫出問題4當問題不存在。

  3. 我還需要輸出SETID的正確數字。

注意:該問題實際上並沒有數字。我使用ID來排序輸出。

輸入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正在尋找一種方法將元素文本拆分爲「?」之前的問題部分。和回答部分(在「?」之後),而不是將文本硬編碼到他的xpath中。 – Filburt

+0

@ O.R.Mapper,你的建議指出了我的正確方向。 ''substring-after(// NTE_NotesAndCommentsSegment_2/NTE_3_Comment [starts-with(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'starts-with(text(),'Question X')'起作用,因爲你說你的實際數據不包含序列號。 – Filburt

+0

正確,我想保持對這個例子的正確回答。 Filburt它不包含序列號,但我知道這4個問題是什麼。 '考試的目的? Annual Physical'開始於Purpose Subtring?給我「年度體育」。此外,問題可能無法按正確的順序進行。我必須以正確的順序輸出它們。感謝您的時間Filburt –