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



我对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>

我需要在每个元素中搜索group,就像在这种情况下它是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、gully、shell12345的组也可能是不同的,也不匹配任何字符串。但好的一点是,我必须搜索的是可用的,所以如果需要,我们也可以提供硬编码的值。

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

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

因为那样这些就不会被复制。

在线XSLT3版本https://xsltfiddle.liberty-development.net/bdxtri和XSLT2版本http://xsltransform.hikmatu.com/eiZQaET.

相关内容

  • 没有找到相关文章

最新更新