xml - 在 XSLT 中使用 for 循环

标签 xml xslt

我有一个以下格式的 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 transformxsl: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/

相关文章:

xml - 使用 xsl 获取无界 xml 中的最后一个元素

.net - 一个同样快速的替代 SecurityElement.Escape(string) 来转义 XML 特殊字符?

php - Google Chrome 将 XML 呈现为 RSS 提要的文本

PHP SoapClient : What is NS2

php - 如何在带有 registerPHPFunctions 的 XSLT 中使用 DOMDocumentFragment?

performance - XSLT 性能

css - 获取 xslt 中的最后一项

java - 取消缩进或线性化 XML

css - 使用外部 CSS 显示 XSLT 的结果

xml - 用于根据当前节点的内容选择父节点的XPath?