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

Xml 使用XSLT标记的位置将其从一个位置移动到另一个位置,xml,xslt,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>

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

2014-03-26-05.22.22.339840
C
2014-03-26-05.05.51.531840
C
2014-03-26-05.22.22.193840T01
999
2014-03-26-05.00.27.105840T01
999
2014-03-26-05.00.27.751840T01
999
应使用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>
               <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>

2014-03-26-05.22.22.339840
C
2014-03-26-05.22.22.193840T01
999
2014-03-26-05.05.51.531840
C
2014-03-26-05.00.27.105840T01
999
2014-03-26-05.00.27.751840T01
999
其思想是将内容在第一个
标记之间移动到
标记的第一个
,第二个
标记之间移动到
标记的第二个
,以此类推。此处,
标记和
标记下的
标记数量不确定

在做了一些小的修改之后,我尝试了这个问题的解决方案。但它不起作用。我使用了以下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/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>

我无法找出我的代码出了什么问题。当然,我的代码肯定不会生成所需的输出。在这个问题上,有谁能帮我提供一个答案吗

如果我的问题不清楚,请随时添加评论,以便我能用更好的语言表达。提前感谢。

希望这有助于:

<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>

  • 第一个模板(matches=“node()|@*”)用于复制属性(应用于属性时),以及复制元素标记并将模板应用于元素的子节点
  • 第三个模板(matches=“Final Results”)在应用时复制“Final Results”标记并将模板应用于其“cases”子元素,从而避免对“resultantissors”执行任何操作
  • 第二个模板matches=“cases/row”将“cases/row”的位置()存储在变量中,创建行标记,使用以下方法复制当前“row”标记中的每个子元素和属性:

    <xsl:apply-templates select="@*"/>
    <xsl:copy-of select="*"/>
    
    
    
    和使用

    <xsl:copy-of select="../../ResultantIssues/issues[position() = $pos]"/>
    
    
    
    移动到结果组织,选择当前位置的“问题”,并将其复制到“行”。 我不善于解释


  • 伟大的这对我有用。谢谢你,墨蒂。你能解释一下你的代码吗?希望解释能有所帮助。。请问它是否混淆:)谢谢,默蒂,你解释得很好。