如何获得信息,并进行排序,使用XSLT唯一标识符元素的一个子集?

StackOverflow https://stackoverflow.com/questions/2418515

  •  19-09-2019
  •  | 
  •  

我是新来的XSLT,我无法解决以下问题:

我有一个这样的XML文件:

<root>
    <subset>
        <e id="A"></e>
        <e id="C"></e>
    </subset>

    <data>
        <info id="A" order="3" name="ANode"></info>
        <info id="B" order="4" name="BNode"></info>
        <info id="C" order="1" name="CNode"></info>
        <info id="D" order="2" name="DNode"></info>
    </data>
</root>

和欲产生这样的:

<root>
    <newnode id="C" order="1" name="CNode"></newnode>
    <newnode id="A" order="3" name="ANode"></newnode>
</root>

正如你所看到的想法是通过获取相应的信息“完成” ID的子集,并据此排序对<data>指定它们的顺序。

注意,<data>应该有很多的子节点。

另外,我从ID的子集<data>元素有关的信息分离的节点,因为我有很多的子集,我不希望有重复的信息“无处不在”。

预先感谢。

有帮助吗?

解决方案

您也可以键关机,这取决于你可能需要与你的实际数据做什么其他的子集。

<xsl:output indent="yes" />

<xsl:key name="subset" match="e" use="@id" />

<xsl:template match="/">
    <root>
    <xsl:for-each select="//info[count(key('subset',@id)[1]) &gt; 0]">
        <xsl:sort select="@order" data-type="number" />
        <newnode id="{@id}" order="{@order}" name="{@name}" />
    </xsl:for-each>
    </root>
</xsl:template>

其他提示

交叉引用用于使用键问:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output indent="yes"/>

  <xsl:key name="k1" match="info" use="@id"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="subset/e">
        <xsl:sort select="key('k1', @id)/@order" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="e">
    <newnode id="{@id}" order="{key('k1', @id)/@order}" name="{key('k1', @id)/@name}"/>
  </xsl:template>

</xsl:stylesheet>

这应该为你提供的输入采样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top