2016-12-29 78 views
0

我有以下XML文件:XML元素排序

<?xml version="1.0" encoding="UTF-8"?> 
     <table> 
      <row> 
       <description2>ABC</description2> 
      </row> 
      <row> 
       <description2>DEF</description2> 
      </row> 
      <row> 
       <description2>GHI</description2> 
      </row> 
      <row> 
       <description1>JKL</description1> 
       <message>msg1</message> 
      </row> 
      <row> 
       <description1>MNO</description1> 
       <message>msg2</message> 
      </row> 
     </table> 

我想包含其中包含描述

所以行节点后显示描述2子节点的所有行节点我生成的XML如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <row> 
     <description1>JKL</description1> 
     <message>msg1</message> 
    </row> 
    <row> 
     <description1>MNO</description1> 
     <message>msg2</message> 
    </row> 
    <row> 
     <description2>ABC</description2> 
    </row> 
    <row> 
     <description2>DEF</description2> 
    </row> 
    <row> 
     <description2>GHI</description2> 
    </row> 
</table> 

我该如何实现i n XSLT?

+0

您是否可以编辑您的问题以显示您尝试过的XSLT?谢谢。 –

+0

@Tim C嗨,我不知道XSLT。如果你能遵守我的要求,请帮助我。谢谢 。 – Sanjay

+0

@TimC嗨,我不知道XSLT。如果你能遵守我的要求,请帮助我。谢谢 。 – Sanjay

回答

0

尝试这样:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="table"> 
     <xsl:apply-templates select="row/description1/.."/> 
     <xsl:apply-templates select="row/description2/.."/> 
    </xsl:template> 
</xsl:stylesheet> 

注意目标元素是如何在第二个模板中选择:

  • row - 寻子row元素,
  • description1 - 找到description1元素(儿童特别是row),
  • .. - 往上一级,找到包含刚刚找到的description1元素的行,并返回这些行。

然后有类似的选择description2(实际上 - 包含这些description2元素的行)。

另一个解决方案,具有真正的排序,特别是如果您的源XML包含description标签终止与其他数字有用。

替换为第二模板:

<xsl:template match="table"> 
    <xsl:for-each select="row"> 
     <xsl:sort select="*[1]/name()" /> 
     <xsl:sort select="*[1]" /> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:for-each> 
</xsl:template> 

第一次排序的关键是这里的第一个孩子标签(description...)和第二的名字 - 它的价值。

如果您不需要此功能,只需删除第二条sort指令。