Как извлечь конкретную часть из XML - PullRequest
1 голос
/ 01 января 2012

У меня есть XML-файл, из которого я должен извлечь определенную часть на основе атрибута id.

Входной XML

<root>
<item id="id_1" state="closed">
    <content>
        <name>Details</name>
    </content>
    <item state="closed" id="id_1_1">
        <content>
            <name title="Name">Identity</name>
        </content>
        <item id="id_1_1_1" state="closed">
            <content>
                <name title="Name">Name</name>
            </content>
            <item id="id_1_1_1_1">
                <content>
                    <name title="First Name">First Name</name>
                </content>
            </item>
            <item id="id_1_1_1_2">
                <content>
                    <name title="Last Name">Last Name</name>
                </content>
            </item>
        </item>
        <item id="id_1_1_2" state="closed">
            <content>
                <name title="Address">Address</name>
            </content>
            <item id="id_1_1_2_1">
                <content>
                    <name title="Address Line 1">Line 1</name>
                </content>
            </item>
            <item id="id_1_1_2_2">
                <content>
                    <name title="Address Line 2">Line 2</name>
                </content>
            </item>
            <item id="id_1_1_2_3">
                <content>
                    <name title="City">City</name>
                </content>
            </item>
        </item>
    </item>
<item>
</root>

Если я дал id_1_1 в качестве входных данных, мой выходной XML долженбыть как показано ниже

Вывод

<item id="id_1_1_1" state="closed">
    <content>
        <name title="Name">Name</name>
    </content>
</item>
<item id="id_1_1_2" state="closed">
    <content>
        <name title="Address">Address</name>
    </content>
</item>

Вывод должен принимать элементы непосредственно ниже выбранного узла (входного идентификатора), а не глубину дальше.

Ответы [ 2 ]

1 голос
/ 01 января 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="text()"/>

 <xsl:template match="item[@id='id_1_1']/item">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:copy-of select="content"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML (слегка исправлено, чтобы сделать его правильно сформированным!):

<root>
    <item id="id_1" state="closed">
        <content>
            <name>Details</name>
        </content>
        <item state="closed" id="id_1_1">
            <content>
                <name title="Name">Identity</name>
            </content>
            <item id="id_1_1_1" state="closed">
                <content>
                    <name title="Name">Name</name>
                </content>
                <item id="id_1_1_1_1">
                    <content>
                        <name title="First Name">First Name</name>
                    </content>
                </item>
                <item id="id_1_1_1_2">
                    <content>
                        <name title="Last Name">Last Name</name>
                    </content>
                </item>
            </item>
            <item id="id_1_1_2" state="closed">
                <content>
                    <name title="Address">Address</name>
                </content>
                <item id="id_1_1_2_1">
                    <content>
                        <name title="Address Line 1">Line 1</name>
                    </content>
                </item>
                <item id="id_1_1_2_2">
                    <content>
                        <name title="Address Line 2">Line 2</name>
                    </content>
                </item>
                <item id="id_1_1_2_3">
                    <content>
                        <name title="City">City</name>
                    </content>
                </item>
            </item>
        </item>
    </item>
</root>

дает желаемый, правильный результат :

<item id="id_1_1_1" state="closed">
   <content>
      <name title="Name">Name</name>
   </content>
</item>
<item id="id_1_1_2" state="closed">
   <content>
      <name title="Address">Address</name>
   </content>
</item>
0 голосов
/ 01 января 2012

Этот XPath:

//item[@id="id_1_1"]/item/content/name

выберет все элементы name, предназначенные только для прямых дочерних элементов элемента item на любом уровне с соответствующим значением атрибута id.

Редактировать : Если вы хотите элементы item, используйте

//item[@id="id_1_1"]/item

, а затем используйте

./content/name

, чтобы выбрать непосредственных потомковте во время итерации.

Кроме того, так как вы добавили следующий комментарий с упоминанием jQuery, обратите внимание, что его атрибут "равно селектору" не использует символ @ в именах атрибутов, равно как ион использует полный синтаксис XPath.

...