2010-05-25 1 views
1

У меня есть серьезная проблема с поиском способа добавить пространство между двумя дочерними элементами.Как добавить пробел при обнаружении определенного шаблона?

<aaa> 
    I want to add <bbb>a</bbb><ccc>space</ccc> between two words. 
</aaa> 

Я хочу, чтобы добавить пробел между «а» и «космических» словами, если ссс элемент непосредственно следует элемент ГЭБ. В настоящее время я применяю шаблон на уровне элемента aaa, а затем обрабатываю элементы bbb и ccc в отдельных шаблонах.

Я понятия не имею, как определить это </bbb><ccc> шаблон заранее.

Примечание: Я не знаю, какие слова будут внутри элементов bbb и ccc.

ответ

2

Это преобразование:

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

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

<xsl:template match= 
    "b[. = 'a' 
    and 
    following-sibling::node() 
        [1] 
        [self::i 
        and 
        . = 'boy' 
        ] 
     ] 
    "> 
    <xsl:call-template name="identity"/> 
    <xsl:text> </xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

когда выполняется на поставленном XML документа:

<aaa> 
    I am <b>a</b><i>boy</i>. 
</aaa> 

производит разыскиваемого, правильный результат:

<aaa> 
    I am <b>a</b> <i>boy</i>. 
</aaa> 

Обратите внимание:

  1. Применение правила в идентичности, чтобы скопировать все узлы.

  2. Переопределение правила идентичности с определенным шаблоном для выполнения добавления символа пробела точно между указанными <b> и <i> узлами.

  3. Образец соответствия (XPath expression), используемый для соответствия точному желаемому узлу <b>, после которого пространство должно быть вставлено.

  4. Повторное использование кода правила шаблона, применяемого и вызываемого по имени.

+1

+1, хорошо. Для более общей версии для добавления пространства между любыми смежными элементами внутри элемента 'aaa' выражение соответствия последнего шаблона может быть записано как' aaa/* [next-sibling :: node() [1]/self: *] ' –

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