对嵌套 XML 中的特定节点进行排序

时间:2021-03-22 13:56:35

标签: xslt-1.0 xslt-grouping

我正在尝试对嵌套 XML 中的特定节点进行排序。我可以很好地对它们进行排序,但输出不包含应该复制的其他 XML 字段。

输入:

<!-- language: lang-xml -->
<PerPerson>
  <PerPerson>
    <personalInfoNav>
      <PerPersonal>
        <lastName></lastName>
        <firstName></firstName>
        <personIdExternal></personIdExternal>
        <startDate></startDate>
      </PerPersonal>
    </personalInfoNav>
    <personIdExternal></personIdExternal>
    <employmentNav>
      <EmpEmployment>
        <personIdExternal></personIdExternal>
        <assignmentClass></assignmentClass>
        <compInfoNav/>
        <jobInfoNav>
          <EmpJob>
            <employeeClass></employeeClass>
            <seqNumber>2</seqNumber>
            <startDate>2020-06-01T00:00:00.000</startDate>
          </EmpJob>
          <EmpJob>
            <employeeClass></employeeClass>
            <seqNumber>3</seqNumber>
            <startDate>2020-01-01T00:00:00.000</startDate>
          </EmpJob>
          <EmpJob>
            <seqNumber>1</seqNumber>
            <startDate>2019-06-01T00:00:00.000</startDate>
          </EmpJob>
        </jobInfoNav>
        <userId></userId>
      </EmpEmployment>
    </employmentNav>
  </PerPerson>
</PerPerson>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="PerPerson/PerPerson">
        <xsl:apply-templates select="employmentNav/EmpEmployment/jobInfoNav/EmpJob">
            <xsl:sort select="startDate" order="descending"/>
            <xsl:sort select="seqNumber" order="descending"/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我如何确保其他所有内容都被复制?

1 个答案:

答案 0 :(得分:0)

我认为你想做:

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

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

<xsl:template match="jobInfoNav">
    <xsl:apply-templates select="EmpJob">
        <xsl:sort select="startDate" order="descending"/>
        <xsl:sort select="seqNumber" order="descending"/>
    </xsl:apply-templates>
</xsl:template>

</xsl:stylesheet>

有关解释,请参阅:https://www.w3.org/TR/1999/REC-xslt-19991116/#section-Processing-Model

相关问题