我在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的组也可能有所不同,也没有匹配任何字符串。 但是好点是我必须搜索的内容可用,因此如果需要,我们也可以提供硬编码的值。
答案 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版本在线。