根据另一个 XML 的元素值对多个 XML 进行排序

Sort multiple XML by element value from another XML

基本上,我在这里尝试的是使用 XSLT 根据引用 XML 中元素的值对多个 XML 进行合并和排序。

> <xsl:variable name="refXml"
> select="document(concat(replace($refXmlTemp,'^file:',''),'/ref.xml'))"/>
> 
> 

> <xsl:for-each select="for $x in
> collection(string-join(($inputDir,'select=*.xml;recurse=yes;on-error=fail'),'?'))
> return 
>                         (if (matches($refXml/root/descendant-or-self::issue/id[normalize-space(.)=normalize-space($x/art/item/id)]/number,'\w+')
> and matches($x/art/item/title,'\w+')) then saxon:discard-document($x) 
>                         else ())">

> <xsl:sort select="$refXml/root/descendant-or-self::issue/id[normalize-space(.)=/art/item/id]/following-sibling::number"/>

上面的代码片段合并了所有输入 XML 但没有排序。

似乎 XSLT xsl:sort 函数只有在指向当前正在处理的 XML 中的值时才会生效。

请指教我如何才能使用 ref.xml 作为排序的参考。

这是 ref.xml 的示例输入:

<root>   
 <issue>
    <id>wlu-101</id>
    <number>1</number>   
 </issue>
 <issue>
    <id>wlu-143</id>
    <number>2</number>
 </issue>
 <issue-group>
    <issue>
      <id>wlu-144</id>
      <number>3</number>
    </issue>
    <issue-group>
      <issue>
        <id>wlu-185</id>
        <number>4</number>
      </issue>
    </issue-group>
</issue-group> 
</root>

<xsl:sort select="$refXml/root/descendant-or-self::issue/id[normalize-space(.)=/art/item/id]/following-sibling::number"/>替换为

<xsl:sort select="key('ref', /art/item/id, $refXml)/number"/>

定义后

<xsl:key name="ref" match="issue" use="normalize-space(id)"/>

作为替代使用 <xsl:sort select="$refXml//issue[normalize-space(id)=current()/art/item/id]/number"/>