Xml 在XSLT中使用for循环
我有以下格式的xml:Xml 在XSLT中使用for循环,xml,xslt,Xml,Xslt,我有以下格式的xml: <?xml version="1.0" encoding="UTF-8"?> <response> <cases> <case>CASE-ONE</case> <case>CASE-TWO</case> </cases> <results> <Final-Results> <i
<?xml version="1.0" encoding="UTF-8"?>
<response>
<cases>
<case>CASE-ONE</case>
<case>CASE-TWO</case>
</cases>
<results>
<Final-Results>
<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</Final-Results>
<Final-Results>
<issues>
<row>
<IKEY>2014-03-26-05.05.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.10.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</Final-Results>
</results>
</response>
案例一
案例二
2014-03-26-05.22.22.193840T01
999
2014-03-26-05.05.51.077840T01
999
2014-03-26-05.10.51.077840T01
999
现在,我想使用XSLT将上述xml转换为以下格式:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<cases>
<case>
CASE-ONE
<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</case>
<case>
CASE-TWO
<issues>
<row>
<IKEY>2014-03-26-05.05.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.10.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</case>
</cases>
</response>
案例一
2014-03-26-05.22.22.193840T01
999
案例二
2014-03-26-05.05.51.077840T01
999
2014-03-26-05.10.51.077840T01
999
其思想是将内容在第一个
标记和第二个
标记之间移动,以此类推。这里,
标记和
标记的数量是不确定的。所以,我想我必须在这里使用for循环之类的东西。老实说,我不擅长使用XSLT。如果你能提供一个解决方案,那就太好了。如果我的问题不清楚,请随时添加评论,以便我能用更好的语言表达。
提前谢谢。我可以这样想:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<response>
<cases>
<xsl:apply-templates select="response/cases/case"/>
</cases>
</response>
</xsl:template>
<xsl:template match="cases/case">
<xsl:variable name="pos" select="position()"/>
<xsl:copy>
<xsl:value-of select="."/>
<xsl:copy-of select="//response/results/Final-Results[position() = $pos]/issues"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
无需使用for循环。使用和
xsl:apply-templates
XML输入
<response>
<cases>
<case>CASE-ONE</case>
<case>CASE-TWO</case>
</cases>
<results>
<Final-Results>
<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</Final-Results>
<Final-Results>
<issues>
<row>
<IKEY>2014-03-26-05.05.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.10.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</Final-Results>
</results>
</response>
<response>
<cases>
<case>CASE-ONE<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</case>
<case>CASE-TWO<issues>
<row>
<IKEY>2014-03-26-05.05.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.10.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</case>
</cases>
</response>
案例一
案例二
2014-03-26-05.22.22.193840T01
999
2014-03-26-05.05.51.077840T01
999
2014-03-26-05.10.51.077840T01
999
XSLT1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*|cases"/>
</xsl:copy>
</xsl:template>
<xsl:template match="case">
<xsl:variable name="pos" select="position()"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:apply-templates select="/*/results/Final-Results[position()=$pos]/issues"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML输出
<response>
<cases>
<case>CASE-ONE</case>
<case>CASE-TWO</case>
</cases>
<results>
<Final-Results>
<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</Final-Results>
<Final-Results>
<issues>
<row>
<IKEY>2014-03-26-05.05.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.10.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</Final-Results>
</results>
</response>
<response>
<cases>
<case>CASE-ONE<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</case>
<case>CASE-TWO<issues>
<row>
<IKEY>2014-03-26-05.05.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.10.51.077840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</case>
</cases>
</response>
案例一
2014-03-26-05.22.22.193840T01
999
案例二
2014-03-26-05.05.51.077840T01
999
2014-03-26-05.10.51.077840T01
999
以下样式表生成所需的结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="case">
<case>
<xsl:value-of select="concat('
', ., '
')" />
<xsl:copy-of
select="../../results/Final-Results[
count(current()/preceding-sibling::case) + 1]/issues" />
</case>
</xsl:template>
<xsl:template match="results" />
</xsl:stylesheet>
如果您可以控制输出文档的设计,我建议您不要使用这样的混合内容
CASE-ONE…
您应该将案例名称包装在一个名称标签中,如CASE-ONE…
或语义上符合您需要的类似内容。