2013-07-31 5 views
1

Могу ли я использовать XSLT для преобразования следующего XML:XSLT: Создание новых тегов вокруг других тегов

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root> 
<p>The chemical formula for water is H<sub>2</sub>O. The rest of this paragraph is not relevant.</p> 
<p>Another paragraph without subscripts.</p> 
</Root> 

к этому:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root> 
<p><text>The chemical formula for water is H</text><sub>2</sub><text>O. The rest of this paragraph is not relevant.</text></p> 
<p>Another paragraph without subscripts.</p> 
</Root> 

т.е. завернуть различные части ара элемента, который содержит вложенные элементы в текстовые элементы?

Это мой XSLT до сих пор:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 
<xsl:template match="Root|p"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="p[child::*[name()='sub']]"> 
    <xsl:copy> 
     <xsl:element name="text"> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="sub"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

но оборачивает весь абзац в <text> элемент и не делит его на . Как я могу заставить его делать то, что я хочу?


Немного справочной информации, если вы заинтересованы: Я хочу, чтобы импортировать XML в Adobe InDesign, но если я применяю только стиль символа югу к субэлементам второй половины пункта (начиная с O) будет по-прежнему находиться в индексе. Я должен обернуть остальные биты в <text>, чтобы форматирование было правильным.

ответ

2

Match на text узлов:

<?xml version="1.0" encoding="UTF-8"?> 
<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="text()[following-sibling::node()[1][self::sub]] 
        | text()[preceding-sibling::node()[1][self::sub]]"> 
    <text> 
    <xsl:value-of select="."/> 
    </text> 
</xsl:template> 

</xsl:stylesheet> 

Конечно, если вы не хотите, что поведение всех text узлов затем отредактировать шаблон соответствия сказать, например, match="p/text()[following-sibling::node()[1][self::sub]] | p/text()[preceding-sibling::node()[1][self::sub]]".

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