2012-01-01 7 views
1

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

Входной 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> 

Вывод должен принять элементы немедленные ниже выбранного узла (ввода id), а не глубже.

+0

'name' уже на два уровня глубже, чем' item', но вы все равно хотите его включить, может быть, вы хотите включить что-либо, кроме вложенных 'item's? –

+0

Это домашнее задание любым способом? –

+0

Я хочу включить содержимое и имя, но не вложенные элементы. FYI, обучение jquery, это для генерации дерева с использованием jstree плагина, который принимает XML-данные в качестве входных данных. – rohit

ответ

1

Это преобразование: (! Слегка скорректированного быть сделаны хорошо сформированные)

<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

Это XPath:

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

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

Edit: Если вы хотите item элементы, используйте

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

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

./content/name 

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

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

+0

Я хочу выбрать сразу элементы (только с содержимым и именем), а не с вложенными элементами. – rohit

+0

Что такое «непосредственные элементы»? Мне кажется, что XPath, который я предоставил, дает единственные релевантные данные в запросе, который вы запросили. Тем не менее, я отредактировал свой ответ для получения дополнительной информации. – Phrogz

Смежные вопросы