使用位置将XSLT标记从一个位置移动到另一个位置

时间:2014-04-17 11:12:56

标签: xml xslt

我是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}}

我无法弄清楚我的代码有什么问题。当然,我的代码肯定没有产生所需的输出。有人可以通过提供答案帮助我解决这个问题吗?

如果我的问题不明确,请随时添加评论,以便我可以用更好的词语。提前谢谢。

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>
  1. 第一个模板(matches =&#34; node()| @ *&#34;)用于复制属性(当应用于属性时),以及复制元素标签并将模板应用于元素&#39; s子节点。
  2. 第三个模板(匹配=&#34;最终结果&#34;),应用后,复制&#34;最终结果&#34;标记并将模板应用于其案例&#34;子元素,从而避免对&#34; ResultantIssues&#34;。
  3. 采取任何行动
  4. 第二个模板匹配=&#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;。 我不好解释。