访问存储在xslt变量中的xml

时间:2013-07-12 13:41:56

标签: 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>

但上面的代码没有给出理想的结果。请帮助。 但上面的代码没有给出理想的结果。请帮助。但上面的代码没有给出理想的结果。请帮助。

2 个答案:

答案 0 :(得分: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将节点推送到模板。

答案 1 :(得分: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:stylesheet元素上。

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

此外,您的xsl:value-of语句不能执行您希望它们执行的操作。当您在xsl:for-each循环中时,上下文节点是数据节点。然后,您将尝试从顶部再次选择,而不是仅选择子元素。将它们更改为如下所示:

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