访问存储在xslt变量中的xml

访问存储在xslt变量中的xml,xslt,Xslt,此代码未给出所需的结果。请帮助。此代码未给出所需的结果。请帮助。 此代码未给出所需的结果。请帮助 <xsl:template match="/"> <xsl:variable name="Resp"> <Response> <Status> <A></A> </Status> <RespRec>

此代码未给出所需的结果。请帮助。此代码未给出所需的结果。请帮助。 此代码未给出所需的结果。请帮助

 <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>

Gmail公司
对
隐私
00
伊梅尔康
DES
类型
01
期望输出:

 <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>

Gmail公司
对
隐私
00
伊梅尔康
DES
类型
01
但是上面的代码没有给出期望的结果。请帮助。
但是上面的代码没有给出期望的结果。请帮助。但是上面的代码没有给出期望的结果。请帮助

在XSLT1.0中,这样输出的XML称为结果树片段。它不是节点集,因此不能在XPath选择中使用它。基本上,你唯一能做的就是把它复制到结果文档中。(谢天谢地,XSLT2.0修复了这个愚蠢的问题。)

但是,如果XSLT处理器支持EXSLT扩展,则可以使用exsl:node set将结果树片段转换为节点集

而且,xsl:value语句并没有完成您希望它们完成的任务。在xsl:for-each循环中,上下文节点是一个数据节点。然后尝试再次从顶部选择,而不仅仅是选择子元素。将其更改为如下所示:

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

在XSLT1.0中,这样输出的XML称为结果树片段。它不是节点集,因此不能在XPath选择中使用它。基本上,你唯一能做的就是把它复制到结果文档中。(谢天谢地,XSLT2.0修复了这个愚蠢的问题。)

但是,如果XSLT处理器支持EXSLT扩展,则可以使用exsl:node set将结果树片段转换为节点集

而且,xsl:value语句并没有完成您希望它们完成的任务。在xsl:for-each循环中,上下文节点是一个数据节点。然后尝试再次从顶部选择,而不仅仅是选择子元素。将其更改为如下所示:

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

假设您使用XSLT 2.0处理器,您可以使用XPath访问变量的内容,但需要在
中为每个
使用相对表达式,例如

<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

将节点推送到模板中。假设您使用XSLT 2.0处理器,您可以使用XPath访问变量的内容,但需要在
中为每个
使用相对表达式,例如

<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

如何选择具有相同名称的子元素将节点推送到模板。示例:。这个节点集也存储在一个变量中。如何选择具有相同名称的子元素。示例:。这个节点集也存储在一个变量中。