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