2009-12-11 19 views
15

Szukam sposobu, aby wyodrębnić i wydrukować element z mojego xml przy użyciu xmlstarlet; Na przykład, jeśli mój xml jestWyodrębnianie i usuwanie elementów przy użyciu xmlstarlet

<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

<book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
</book> 

</bookstore> 

chciałbym wydrukować elementu książki z ceną = 29.99 jako:

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

Rozumiem kwerendę XPath, aby wybrać taki element (/ księgarnia/książki [ price = 29,99]), ale Nie mogę wydrukować/zrzucić go na standardowe wyjście. Jeśli użyję opcji -v i użyję opcji -v (.), Nie otrzymam wyników tak, jak chcę (przy wszystkich tagach w nim zawartych) po prostu otrzymuję wartości tekstowe. Powinien istnieć sposób, by po prostu zrzucić wybrany element takim, jaki jest, i tego właśnie szukam.

Dzięki w oczekiwaniu.

Odpowiedz

15

Korzystanie z „-c” opcji (kopiuj), należy osiągnąć to, co jesteś po:

xmlstarlet sel -t -c "/bookstore/book[price=29.99]" books.xml 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

Można oglądać XSLT generowany wewnętrznie w xmlstarlet dodając globalny „-C” przełącznik po " sel ". To pokazuje, w jaki sposób wyniki opcja kopii w XSLT kopia z konstruktem:

... 
<xsl:template name="t1"> 
    <xsl:copy-of select="/bookstore/book[price=29.99]"/> 
</xsl:template> 
... 

Wynika to w węzłach przestrzeni nazw węzłów potomnych i atrybuty węzłów jest włączone, cf. specyfikacja XSLT (see w3schools summary).

+0

Dzięki za to zadziałało! – shrijeet

+0

Musiał zmienić liczbę znaków, aby uniknąć minimum 6 znaków ograniczenia zmiany. nie zadziałałby dla mnie, chyba że umieściłbym @ przed atrybutem, tj. @ cena = 29,99 zamiast ceny = 29,99 –

+0

Dzięki .. spędziłem prawie miesiąc szukając tego przełącznika -c. – ifelsemonkey

Powiązane problemy