XSLT:如果结果为true则匹配字段字符串,然后复制完整的对应节点

时间:2018-12-25 12:51:27

标签: xslt xslt-1.0 xslt-2.0

我在XSLT中还很陌生。

我需要协助和指导来完成以下任务

我有一个输入xml:

<Prices>
<Price>
    <Name>1234</Name>
    <Type>account</Type>
    <group>shell</group>
    <Cost>0.23</Cost>

</Price>
<Price>
    <Name>1234</Name>
    <Type>account</Type>
    <group>shell</group>
    <Cost>0.23</Cost>

</Price>
<Price>
    <Name>test12345</Name>
    <Type>Data Stored - Tables</Type>
    <group>--</group>
    <Cost>0.00</Cost>

</Price>

我需要在每个元素中搜索组,例如在这种情况下,它是 shell 。 一旦外壳匹配,完整的节点应该出现在输出xml中,例如

<Prices>
<Price>
    <Name>1234</Name>
    <Type>account</Type>
    <group>shell</group>
    <Cost>0.23</Cost>

</Price>
<Price>
    <Name>1234</Name>
    <Type>account</Type>
    <group>shell</group>
    <Cost>0.23</Cost>

</Price>
 </Prices>

我尝试使用很多xslt,但无法获得此输出。

有人可以帮我吗?

这里,输入文件只有3个节点,但实际上它也可以有50个以上的节点。

尝试使用此xslt但失败了

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- Identity transform -->
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@* | node()"> 
<xsl:copy> 
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:param name="str" select="'shell'"/>
<xsl:template match="@* | node()">
<output> 
<xsl:for-each select="//*[.=$str]">
<xsl:copy> 
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:for-each> 
</output> 
</xsl:template> 
</xsl:stylesheet>

感谢Martin帮助以前的用例。

现在我也希望这类似于搜索两个或多个变量。要了解的是,下面是xml输入文件

<Prices>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>shell</group>
<Cost>0.23</Cost>

</Price>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>shell</group>
<Cost>0.23</Cost>

</Price>

<Price>
<Name>test12345</Name>
<Type>Data Stored - Tables</Type>
<group>--</group>
<Cost>0.00</Cost>
</Price>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>shell12345</group>
<Cost>0.54</Cost>
</Price>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>nutshell1234</group>
<Cost>0.60</Cost>
</Price>

</Prices>

我希望输出为

<Prices>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>shell</group>
<Cost>0.23</Cost>

</Price>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>shell</group>
<Cost>0.23</Cost>

</Price>
<Price>
<Name>1234</Name>
<Type>account</Type>
<group>shell12345</group>
<Cost>0.54</Cost>
</Price>

<Price>
<Name>1234</Name>
<Type>account</Type>
<group>nutshell1234</group>
<Cost>0.60</Cost>
</Price>

</Prices>

另外,具有sheel,nutshell和shell12345的组也可能有所不同,也没有匹配任何字符串。 但是好点是我必须搜索的内容可用,因此如果需要,我们也可以提供硬编码的值。

1 个答案:

答案 0 :(得分:0)

考虑到您从身份转换模板开始,我认为最简单的方法是为那些Price元素中没有所需group值的元素添加一个空模板:

 <xsl:template match="Price[not(group = $str)]"/>

那样,这些将不会被复制。

https://xsltfiddle.liberty-development.net/bdxtri的XSLT 3版本和http://xsltransform.hikmatu.com/eiZQaET的XSLT 2版本在线。