XSLT: чтобы соответствовать строке поля, если результат равен true, то скопируйте полный соответствующий узел - PullRequest
0 голосов
/ 25 декабря 2018

Я довольно новичок в 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>

Спасибо Мартину за помощь в предыдущем случае использования.

Также теперь я хочу, чтобы это было похоже на поиск двух или более переменных.Чтобы понять, ниже приведен входной файл 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 голосов
/ 25 декабря 2018

Учитывая, что вы начинаете с шаблона преобразования идентификаторов, я думаю, что самый простой подход - добавить пустой шаблон для тех элементов Price, которые не имеют желаемого значения group:

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

таким образомони не будут скопированы.

Online в версии XSLT 3 по адресу https://xsltfiddle.liberty -development.net / bdxtri и в версии XSLT 2 по адресу http://xsltransform.hikmatu.com/eiZQaET.

...