根据另一个 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"/>
。
基本上,我在这里尝试的是使用 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"/>
。