2013-10-04 2 views
0

У меня есть XML с последовательностью тегов и текста,Как указать XPath на следующий-родной/текст()?

 <table-wrap id="t01"> <label>Tabela 1</label>aaaa <caption>...</caption> 
     ... 
    </table-wrap> 

и необходимо удалить текст «АААА», то есть следующий-родственный маркирующие. У меня есть тождественное преобразование XSLT для решения этой задачи, что-то вроде

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

<xsl:template match="table-wrap/label::following-sibling/text()" /> 

проблемы является как выразить XPath текста следующих-родственного?

PS: xpath примера неверен, является только иллюстративным. Я пробую table-wrap/label/following-sibling::text() и другие, и ошибки.

ответ

1

Я предположил, что вы хотите, чтобы удалить текст, если они приходят в любом месте после <label> элемента на том же уровне. (Если вы просто хотите, чтобы удалить их, если они приходят сразу после <label> элемента, который является довольно тривиальное изменение.)

Это таблицы стилей XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <!-- Matches any text nodes that are children of the table-wrap element, as long as 
     they have a label element as a preceding sibling. --> 
    <xsl:template match="table-wrap/text()[preceding-sibling::label]"/> 
</xsl:stylesheet> 

производит следующий вывод применительно к вашему примеру ввода XML:

<table-wrap id="t01"> 
    <label>Tabela 1</label><caption>...</caption></table-wrap> 
1

Строка aaaa - это фактически текст узла table-wrap, так как он не завернут в другой элемент. В этом случае вы можете обновить соответствие шаблона ниже.

<xsl:template match="table-wrap/text()" /> 
Смежные вопросы