此代码未给出所需的结果。请帮助。这段代码没有给出理想的结果。请帮忙。 这段代码没有给出理想的结果。请帮助。
<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>
但上面的代码没有给出理想的结果。请帮助。 但上面的代码没有给出理想的结果。请帮助。但上面的代码没有给出理想的结果。请帮助。
答案 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>