2015-10-22 129 views
2

濾除元件如何過濾掉不具有帶有魔術值的屬性並保持文檔的其餘部分的某些類型的元素?所有這些使用xmlstarletxmlstarlet:具有屬性

我得遠是什麼:

cat <<EOF> database.xml 
<?xml version="1.0"?> 
<database> 

    <some name="A" /> 
    <some name="B" /> 
    <some name="C" /> 
    <text>this is some text to be applied...</text> 
    <project> 
     <test deeper="structure"/> 
    </project> 

</database> 
EOF 

xmlstarlet sel -t -m "*" -c "*[not(self::some[@name != 'A'])]" database.xml 

產生

<some name="A"/><text>this is some text to be applied...</text><project> 
     <test deeper="structure"/> 
    </project> 

但這個隱藏我的珍貴<database>tag。除了壓痕,這是沒有問題的......而當<some>都不是<database>嫡系的<project>例如孩子的不起作用。

我想要得到的是數據庫,因爲它是,但所有<some>刪除除了了一個名爲A

<database> 

    <some name="A" /> 


    <text>this is some text to be applied...</text> 
    <project> 
     <test deeper="structure"/> 
    </project> 

</database> 

問候

+0

你想回到什麼?問題並不清楚。 –

+0

的XPath像* //數據庫/ *」可能工作職位詳細信息'不是嫡系...' – SIslam

回答

4

不幸的是,xmlstarlet的sel不支持apply-templates,但你可以使用這個命令ed

xmlstarlet ed -d '/database//some[@name != "A"]' input.xml 
+0

,而黑客和學習XSLT我有瞎子......呃男人,這太簡單了......笨蛋......謝謝! – klsdjfhsalkjfhl

0

編寫XSLT樣式表做

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="some[@name != 'A']"/> 

</xsl:stylesheet> 

然後調用xmlstarlet到樣式表適用於您的輸入XML:xmlstarlet tr sheet.xsl input.xml

+0

好,偉大:這給出結果,我需要......但它會很美好,使這個在命令行上工作... – klsdjfhsalkjfhl

+0

而這個作品出色,我的要求是直接在命令行(認爲的Makefile)做到這一點。所以接受對方的反應是有效的,對不起;-) – klsdjfhsalkjfhl