sorting - 如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序
问题描述
我正在尝试转换输入 XML,其中所有父节点都说“x”需要被提取、排序,然后根据它们的子节点说“y”值在最终输出 XML 中重新排序。下面是我的 XML,我正在尝试对其进行修改,以便最终的 XML 将元素按升序排列,其中排序是基于 xpath 中的数值完成的notes/notesBODY/group/text
,基本上是<text>1. </text>
所有元素中存在的notes
元素。但是输出 XML 并不像预期的那样,因为我似乎无法弄清楚如何在 XSLT 中准确地使用排序。任何帮助表示赞赏。
输入 XML:
<root>
<group>
<text>group1</text>
</group>
<group>
<text>group2</text>
</group>
<notes>
<notesText>notes1</notesText>
<notesBODY>
<group>
<text>2. </text>
<text>notesbody1</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes2</notesText>
<notesBODY>
<group>
<text>1. </text>
<text>notesbody2</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes3</notesText>
<notesBODY>
<group>
<text>3. </text>
<text>notesbody3</text>
</group>
</notesBODY>
</notes>
<group>
<text>group3</text>
<notes>
<notesText>notes4</notesText>
<notesBODY>
<group>
<text>4. </text>
<text>notesbody4</text>
</group>
</notesBODY>
</notes>
</group>
<group>
<text>group4</text>
</group>
<group>
<text>group5</text>
<notes>
<notesText>notes5</notesText>
<notesBODY>
<group>
<text>6. </text>
<text>notesbody5</text>
</group>
</notesBODY>
</notes>
</group>
<notes>
<notesText>notes6</notesText>
<notesBODY>
<group>
<text>5. </text>
<text>notesbody6</text>
</group>
</notesBODY>
</notes>
<group>
<text>group6</text>
</group>
<group>
<text>group7</text>
</group>
<group>
<text>group8</text>
<notes>
<notesText>notes7</notesText>
<notesBODY>
<group>
<text>8. </text>
<text>notesbody7</text>
</group>
</notesBODY>
</notes>
</group>
<notes>
<notesText>notes8</notesText>
<notesBODY>
<group>
<text>7. </text>
<text>notesbody8</text>
</group>
</notesBODY>
</notes>
<group>
<text>group9</text>
</group>
</root>
预期输出:
<root>
<group>
<text>group1</text>
</group>
<group>
<text>group2</text>
</group>
<group>
<text>group3</text>
</group>
<group>
<text>group4</text>
</group>
<group>
<text>group5</text>
</group>
<group>
<text>group6</text>
</group>
<group>
<text>group7</text>
</group>
<group>
<text>group8</text>
</group>
<group>
<text>group9</text>
</group>
<notes>
<notesText>notes2</notesText>
<notesBODY>
<group>
<text>1. </text>
<text>notesbody2</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes1</notesText>
<notesBODY>
<group>
<text>2. </text>
<text>notesbody1</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes3</notesText>
<notesBODY>
<group>
<text>3. </text>
<text>notesbody3</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes4</notesText>
<notesBODY>
<group>
<text>4. </text>
<text>notesbody4</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes6</notesText>
<notesBODY>
<group>
<text>5. </text>
<text>notesbody6</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes5</notesText>
<notesBODY>
<group>
<text>6. </text>
<text>notesbody5</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes8</notesText>
<notesBODY>
<group>
<text>7. </text>
<text>notesbody8</text>
</group>
</notesBODY>
</notes>
<notes>
<notesText>notes7</notesText>
<notesBODY>
<group>
<text>8. </text>
<text>notesbody7</text>
</group>
</notesBODY>
</notes>
</root>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="notes">
<xsl:apply-templates select="@*" />
<xsl:copy>
<xsl:apply-templates select="node()">
<xsl:sort select="notesBODY/group/text[position() = 0]" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
解决方案
我想你基本上想使用两个模板
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="group"/>
<xsl:apply-templates select=".//notes">
<xsl:sort select="notesBODY/group/text[1]"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="group">
<xsl:copy>
<xsl:apply-templates select="* except notes"/>
</xsl:copy>
</xsl:template>
加上显然你已经拥有的身份转换。
推荐阅读
- php - Apache 虚拟主机没有进入正确的文件夹
- java - 为什么java线程无法获取最新值
- tensorflow - Tensorflow R-CNN 网络小物体检测 - 并排的物体,一个分类正确,另一个完全漏掉
- excel - 如何从像自动填充这样的单元格生成公式
- java - 如何为 EntityManager 设置默认值
- image - cntk 图像解串器变换 mean_file
- google-chrome - 无头铬地理定位
- windows - Powershell 将文件复制到所有用户 LOCALAPPDATA 创建路径
- angular - Angular 6重定向到主页时,页面重定向但不加载
- batch-file - 将当前日期作为变量插入到 del 网络共享文件的批处理文件