【发布时间】:2015-11-16 08:51:36
【问题描述】:
我有一个可能包含零件本身的零件列表。实际上是物料清单 (BOM)。一些部件具有将它们标识为“备件”的元素。在将我的转换为另一个 XML 文件时,我只对包含“备件”的节点(和祖先)感兴趣,换句话说,<Spare_part_indicator> 但也维护该特定节点中的所有兄弟姐妹。
这是我作为 XML 的示例 BOM:
<Level levelNo="1">
<Component_number>HEKT109476R4</Component_number>
<Object_description>KEY INTERLOCK</Object_description>
<Level levelNo="2">
<Component_number>HENS434350</Component_number>
<Object_description>LOCK BARREL (PLACEHOLDER)</Object_description>
</Level>
<Level levelNo="2">
<Component_number>HEKT460536P3</Component_number>
<Object_description>SWITCH_SEC:_PSEN ME1S/1AR_2O/2S</Object_description>
<Spare_part_indicator>2</Spare_part_indicator>
<Sort_String>S420</Sort_String>
<QR_code>HEKT460536P3.png</QR_code>
</Level>
<Level levelNo="2">
<Component_number>HEKT460751R2</Component_number>
<Object_description>SHEET METAL</Object_description>
<Level levelNo="3">
<Component_number>HEKT323873P1</Component_number>
<Object_description>C-PAN</Object_description>
</Level>
<Level levelNo="3">
<Component_number>HEKT453450P5</Component_number>
<Object_description>HIGH VOLTAGE CAPACITOR 5NF/30KV 10%</Object_description>
<Spare_part_indicator>3</Spare_part_indicator>
<QR_code>HEKT453450P5.png</QR_code>
</Level>
</Level>
</Level>
<Level levelNo="1">
<Component_number>HEKT109444R3</Component_number>
<Object_description>FILTER NETWORK 500KW</Object_description>
<Level levelNo="2">
<Component_number>HEKT457790P1</Component_number>
<Object_description>BRACKET</Object_description>
</Level>
<Level levelNo="2">
<Component_number>HEKT323840P1</Component_number>
<Object_description>COIL</Object_description>
<Spare_part_indicator>3</Spare_part_indicator>
<Sort_String>L401</Sort_String>
<QR_code>HEKT323840P1.png</QR_code>
</Level>
</Level>
现在我想将上面的列表转换成一个新的 XML 树,它只包含元素为 <Spare_part_indicator> 的节点,但保持层次结构,包括祖先。我遇到了以下 XSL 样式表,经过一些修改,它完全符合我的要求。但不幸的是,它只留下了元素 <Spare_part_indicator> 并删除了所有其他元素,例如 Component_numberetc。
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="subSelectionXPath"
select="//Spare_part_indicator"
/>
<xsl:template match="*">
<xsl:choose>
<xsl:when test=
"descendant::node()
[count(.|$subSelectionXPath)
=
count($subSelectionXPath)
]
">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:when>
<xsl:when test=
"count(.|$subSelectionXPath)
=
count($subSelectionXPath)
">
<xsl:copy-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
上述 BOM 的预期结果应如下所示:
<Level levelNo="1">
<Component_number>HEKT109476R4</Component_number>
<Object_description>KEY INTERLOCK</Object_description>
<Level levelNo="2">
<Component_number>HEKT460536P3</Component_number>
<Object_description>SWITCH_SEC:_PSEN ME1S/1AR_2O/2S</Object_description>
<Spare_part_indicator>2</Spare_part_indicator>
<Sort_String>S420</Sort_String>
<QR_code>HEKT460536P3.png</QR_code>
</Level>
<Level levelNo="2">
<Component_number>HEKT460751R2</Component_number>
<Object_description>SHEET METAL</Object_description>
<Level levelNo="3">
<Component_number>HEKT453450P5</Component_number>
<Object_description>HIGH VOLTAGE CAPACITOR 5NF/30KV 10%</Object_description>
<Spare_part_indicator>3</Spare_part_indicator>
<QR_code>HEKT453450P5.png</QR_code>
</Level>
</Level>
</Level>
<Level levelNo="1">
<Component_number>HEKT109444R3</Component_number>
<Object_description>FILTER NETWORK 500KW</Object_description>
<Level levelNo="2">
<Component_number>HEKT323840P1</Component_number>
<Object_description>COIL</Object_description>
<Spare_part_indicator>3</Spare_part_indicator>
<Sort_String>L401</Sort_String>
<QR_code>HEKT323840P1.png</QR_code>
</Level>
</Level>
到目前为止,我还想不通,我怎样才能保留同级元素,以及父节点中的元素以及这里和那里的提示,将不胜感激。 我希望我能正确描述问题,请耐心等待,因为我才刚刚开始发现 XSL 样式表的强大功能。
【问题讨论】: