我有一个以下格式的 xml:
<?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>
现在,我想使用 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>
这个想法是将内容移动到第一个<issues> </issues>
之间标签到第一个 <case> </case>
标签和第二个 <issues> </issues>
标签到第二个标签,依此类推。这里的数量<case>
标签和 <issues>
标签是不确定的。所以,我想我必须在这里使用 for 循环之类的东西。老实说,我不是使用 XSLT 的专家。如果您能提供解决方案那就太好了。如果我的问题不清楚,请随时添加评论,以便我可以用更好的语言表达。
提前致谢。
最佳答案
无需使用for循环。使用identity transform和 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>
XSLT 1.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<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>
关于xml - 在 XSLT 中使用 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23112904/