2013-07-12 3 views
1

Этот код не дает желаемого результата. Пожалуйста, помогите. Этот код не дает желаемого результата. Пожалуйста, помогите. Этот код не дает желаемого результата. Пожалуйста, помогите.Доступ к xml хранится в переменной xslt

<xsl:template match="/"> 
<xsl:variable name="Resp"> 
    <Response> 
     <Status> 
      <A></A> 
     </Status> 
     <RespRec> 
      <Data> 
       <A1>gmailcom</A1> 
       <B1>YES</B1> 
       <C1>PRIVACY</C1> 
       <D1>00</D1> 
      </Data> 
      <Data> 
       <A1>Ymailcom</A1> 
       <B1>DES</B1> 
       <C1>TYPE</C1> 
       <D1>01</D1> 
      </Data> 
     </RespRec> 
    </Response> 
</xsl:variable> 
<xsl:element name="Response"> 

    <xsl:for-each select="$Resp/Response/RespRec/Data"> 
     <ABCD> <!-- It can repeat as many as Data element is there --> 
      <A1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/A1" /> 
      </A1> 
      <B1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/B1" /> 
      </B1> 
      <C1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/C1" /> 
      </C1> 
      <D1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/D1" /> 
      </D1> 
     </ABCD> 
    </xsl:for-each> 

</xsl:element> 
</xsl:template> 

Желаемые из пут:

<Response> 
    <ABCD> 
    <A1>gmailcom</A1> 
         <B1>YES</B1> 
         <C1>PRIVACY</C1> 
         <D1>00</D1> 
</ABCD> 
<ABCD> 
<A1>Ymailcom</A1> 
         <B1>DES</B1> 
         <C1>TYPE</C1> 
         <D1>01</D1> 
    </ABCD> 
    </Response> 

Но приведенный выше код не дают желаемый result.Please помощи. Но приведенный выше код не дает желаемого результата. Пожалуйста, помогите. Но приведенный выше код не дает желаемого результата. Пожалуйста, помогите.

ответ

0

В XSLT 1.0 выводимый таким образом XML является тем, что называется фрагментом дерева результатов. Это не набор узлов, поэтому вы не можете использовать его в выборе XPath. В основном единственное, что вы можете сделать с этим, - это скопировать его в результирующий документ. (К счастью, XSLT 2.0 исправил эту глупость.)

Однако, если ваш XSLT-процессор поддерживает расширения EXSLT, вы можете использовать exsl: node-set для преобразования фрагмента дерева результатов в набор узлов. http://exslt.org/exsl/functions/node-set/index.html

<xsl:for-each select="exsl:node-set($Resp)/Response/RespRec/Data"> 

Убедитесь объявить префикс пространства имен exsl где-нибудь, желательно на XSL: элемент таблицы стилей.

xmlns:exsl="http://exslt.org/common" 

Кроме того, ваши инструкции xsl: value не выполняют то, что вы хотите от них делать. Когда вы находитесь внутри цикла xsl: for-each, узлом контекста является узел данных. Затем вы пытаетесь выбрать снова сверху, а не просто выбирать дочерний элемент. Измените их, чтобы просто выглядеть следующим образом:

<A1> 
    <xsl:value-of select="A1" /> 
</A1> 
+0

Thank You Shaun.It действительно работал. – sasPrasH

+0

Как выбрать дочерний элемент с одинаковыми именами. Пример: . И этот набор узлов также сохраняется в переменной. – sasPrasH

1

Предполагая, что вы используете процессор XSLT 2.0 вы можете получить доступ к содержимому переменной с помощью XPath, но вы должны использовать относительные выражения внутри вашей for-each например,

<xsl:for-each select="$Resp/Response/RespRec/Data"> 
     <ABCD> <!-- It can repeat as many as Data element is there --> 
      <A1> 
       <xsl:value-of select="A1" /> 
      </A1> 

Я бы, однако, предположить, чтобы написать шаблон и нажать узлы в шаблон с apply-templates.

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