2013-05-21 4 views
3

мне нужна помощь, чтобы превратить этот XML-документ:Удалить определенный текст между тегами XML

<root> 
<tree> 
<leaf>Hello</leaf> 
ignore me 
<pear>World</pear> 
</tree> 
</root> 

к этому:

<root> 
<tree> 
<leaf>Hello</leaf> 
<pear>World</pear> 
</tree> 
</root> 

Пример упрощен, но в принципе, я мог бы либо удалить все экземпляры «игнорировать меня» или все, что не внутри листа или груши.

Я только придумать с этим XSLT, который копирует почти все:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" encoding="UTF-8" standalone="yes"/> 

    <xsl:template match="root|tree"> 
     <xsl:element name="{name()}"> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="leaf|pear"> 
     <xsl:element name="{name()}"> 
      <xsl:copy-of select="child::node()"/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

То, что я узнал, как использовать XSL: вызов-шаблон, чтобы удалить текст внутри листа или груши элемент, но это не работает для вещей внутри дерева элемент.

Заранее спасибо.

ответ

4

Похоже, что преобразование идентичности - это то, что вы ищете. Поскольку текст как прямой дочерний элемент корня или дерева следует игнорировать, добавьте для него пустые шаблоны. Поэтому попробуйте:

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

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes" /> 

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

</xsl:stylesheet> 

Какой будет генерировать следующий вывод:

<root> 
    <tree> 
    <leaf>Hello</leaf> 
    <pear>World</pear> 
    </tree> 
</root> 
+0

Принято для простоты. Они оба очень хорошие ответы, в зависимости от конкретной ситуации. –

2

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

XML Input

<root> 
    <tree> 
     <leaf>Hello</leaf> 
     ignore me 
     <pear>World</pear> 
    </tree> 
</root> 

XSLT 1,0

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

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

    <xsl:template match="*[* and text()]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|*"/> 
     </xsl:copy>  
    </xsl:template> 

</xsl:stylesheet> 

XML Output

<root> 
    <tree> 
     <leaf>Hello</leaf> 
     <pear>World</pear> 
    </tree> 
</root> 

Кроме того, если текст действительно только ignore me, вы можете сделать это:

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

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

    <xsl:template match="text()[normalize-space(.)='ignore me']"/> 

</xsl:stylesheet> 
Смежные вопросы