我是XSLT的新手。 下面是输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<results>
<Final-Results>
<cases>
<row>
<CRDATTIM>2014-03-26-05.22.22.339840</CRDATTIM>
<RECORDCD>C</RECORDCD>
</row>
<row>
<CRDATTIM>2014-03-26-05.05.51.531840</CRDATTIM>
<RECORDCD>C</RECORDCD>
</row>
</cases>
<ResultantIssues>
<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
<issues>
<row>
<IKEY>2014-03-26-05.00.27.105840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.00.27.751840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</ResultantIssues>
</Final-Results>
</results>
</response>
上面的xml应该使用XSLT修改如下。
<?xml version="1.0" encoding="UTF-8"?>
<response>
<results>
<Final-Results>
<cases>
<row>
<CRDATTIM>2014-03-26-05.22.22.339840</CRDATTIM>
<RECORDCD>C</RECORDCD>
<issues>
<row>
<IKEY>2014-03-26-05.22.22.193840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</row>
<row>
<CRDATTIM>2014-03-26-05.05.51.531840</CRDATTIM>
<RECORDCD>C</RECORDCD>
<issues>
<row>
<IKEY>2014-03-26-05.00.27.105840T01</IKEY>
<PRTY>999</PRTY>
</row>
<row>
<IKEY>2014-03-26-05.00.27.751840T01</IKEY>
<PRTY>999</PRTY>
</row>
</issues>
</row>
</cases>
</Final-Results>
</results>
</response>
我们的想法是将第一个<issues> </issues>
标记之间的内容移动到<row> </row>
个<case> </case>
标记的第一个<issues> </issues>
,将第二个<row> </row>
标记移动到第二个<case> </case>
标记} <row>
标签等等。此处<case>
代码下的<issues>
代码和<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/results/Final-Results/cases"/>
</cases>
</response>
</xsl:template>
<xsl:template match="response/results/Final-Results/cases">
<xsl:variable name="pos" select="position()"/>
<xsl:copy>
<xsl:value-of select="."/>
<xsl:copy-of select="//response/results/Final-Results/ResultantIssues[position() = $pos]/issues"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
代码的数量不确定。
我在做了一些小修改后尝试了解决问题的解决方案Using for loop in XSLT。但它没有用。我使用了以下XSLT代码:
{{1}}
我无法弄清楚我的代码有什么问题。当然,我的代码肯定没有产生所需的输出。有人可以通过提供答案帮助我解决这个问题吗?
如果我的问题不明确,请随时添加评论,以便我可以用更好的词语。提前谢谢。
答案 0 :(得分:2)
希望这会有所帮助:
<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="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="cases/row">
<xsl:variable name="pos" select="position()"/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:copy-of select="*"/>
<xsl:copy-of select="../../ResultantIssues/issues[position() = $pos]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Final-Results">
<xsl:copy>
<xsl:apply-templates select="cases"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
第二个模板匹配=&#34;个案/行&#34;,存储&#34;个案例/行&#34;的位置()在变量中,创建行标记,复制当前&#34; row&#34;中的每个子元素和属性。标签使用:
<xsl:apply-templates select="@*"/>
<xsl:copy-of select="*"/>
并使用
<xsl:copy-of select="../../ResultantIssues/issues[position() = $pos]"/>
转到ResultantIssues,选择&#34;问题&#34;使用当前位置,并将其复制到&#34; row&#34;。 我不好解释。