[英]Get first occurrence of a node that matches criteria during XSLT 1.0 transform
我正在尝试获取第一次出现的Machine / Properties / Axes / Axis / AxisID / Name值,其中标准Machine / Properties / Axes / Axis / Type = Rotary,以便我可以使用Name元素填充Top元素。
我尝试了以下XSLT模板,但它没有产生正确的输出:
<xsl:template match="cd:Machine/cd:Properties[cd:Axes/cd:Axis/cd:Type='Rotary'][1]/cd:Rotaries/cd:Top">
<xsl:copy>
<Axis>
<xsl:value-of select="ancestor::cd:Properties/cd:Axes/cd:Axis/cd:AxisID/cd:Name" />
</Axis>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
</xsl:copy>
</xsl:template>
Top元素的期望输出:
<Top>
<Axis>R1</Axis>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
</Top>
输入:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns="http://schemas.datacontract.org/2004/07/CMachine" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Machine>
<Price>120000</Price>
<Properties>
<Axes>
<Axis>
<AxisID>
<Name>X</Name>
<Type>X</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>Y</Name>
<Type>Y</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>Z</Name>
<Type>Z</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>R1</Name>
<Type>B</Type>
</AxisID>
<Type>Rotary</Type>
</Axis>
<Axis>
<AxisID>
<Name>R2</Name>
<Type>C</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
</Axes>
<Ordering>XR1YR2Z</Ordering>
<Rotaries>
<Top i:nil="true" />
<Bottom i:nil="true"/>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
<Mode>222</Mode>
</Rotaries>
</Properties>
</Machine>
</ArrayOfMachine>
任何帮助将不胜感激!
[更新]
在使用libxslt 1.1.28的xsltproc
进行测试时,我发现在匹配模式与位置谓词方面存在不一致的错误行为。 此版本的xsltproc
通过此匹配表达式将模板与示例中的一个节点匹配:
cd:Machine/cd:Properties[cd:Axes/cd:Axis/cd:Type = 'Rotary'][1]
,并在该模板中,它通过表达式选择非空节点集
cd:Rotaries/cd:Top
。 以这种方式选择的节点也应该与表达式的模板匹配
cd:Machine/cd:Properties[cd:Axes/cd:Axis/cd:Type='Rotary'][1]/cd:Rotaries/cd:Top
,但是xsltproc
实际上与输入到模板的任何节点都不匹配,因为它的匹配表达式。 这不一定与您的问题直接相关,但这是考虑您的方法的变化的原因。
无论如何, xsl:value-of
的select
表达式肯定是不正确的。 它选择一个包含所有轴的<cd:Name>
元素的节点集,而不仅仅是具有'Rotary'
类型'Rotary'
元素,并将其转换为字符串会产生集合中第一个节点的字符串值。 那不是你想要的那个。 尽管我在上面描述了不一致,但我发现你的匹配表达式的变体对我来说是一个xsl:value-of
的select
表达式xsl:value-of
可以选择你想要的节点。 把它放在一起,然后,这个模板适合我,因为你似乎想要:
<xsl:template match="cd:Machine/cd:Properties[cd:Axes/cd:Axis/cd:Type='Rotary']/cd:Rotaries/cd:Top">
<xsl:copy>
<Axis>
<xsl:value-of select="ancestor::cd:Properties/cd:Axes/cd:Axis[cd:Type = 'Rotary'][1]/cd:AxisID/cd:Name" />
</Axis>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.