2015-08-31 9 views
1

У меня есть XML, как следует,XSLT - добавить новый текстовый узел анализирующая() узел

<doc> 
    <chap>&lt;The root&gt; 
    &lt;element that&gt; 
    &lt;declares&gt; 
    &lt;the document to be an XSL style sheet&gt;</chap> 
</doc> 

Мне нужно написать XSL добавить отдельные узлы с именем <p> к тексту, где существуют между &lt; и &gt; в <chap>.

Так что выход должен быть,

<doc> 
    <p>&lt;The root&gt;</p> 
    <p>&lt;element that&gt;</p> 
    <p>&lt;declares&gt;</p> 
    <p>&lt;the document to be an XSL style sheet&gt;</p> 
</doc> 

Я могу написать шаблон для текста внутри <chap> узла, как, <xsl:template match="chap/text()", но я не могу придумать способ, чтобы добавить новый <p>, анализируя текст() узел в <chap>

Любые предложения, как я могу это сделать?

ответ

1

Для этого вы можете использовать analyze-string элемент, чтобы получить текст, который соответствует регулярному выражению

<xsl:analyze-string select="." regex="&lt;(.*)&gt;"> 

И выводить текст, совпадающий с помощью круглых скобок, используйте regex-group

<xsl:value-of select="regex-group(1)" /> 

Try этот шаблон XSLT

<xsl:template match="chap"> 
    <xsl:analyze-string select="." regex="&lt;(.*)&gt;"> 
     <xsl:matching-substring> 
     <p><xsl:value-of select="regex-group(1)" /></p> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
     <xsl:value-of select="." /> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

Читайте также на R Выражение соответствия Регулярная на http://www.xml.com/pub/a/2003/06/04/tr.html

+1

@sanjay, вместо '' 'использование ', то вы получите соответствие строки. Вы также можете упростить 'regex' до' <. * > ' –

+1

Я думаю, что для регулярного выражения может потребоваться' < ([^ >] * > ', чтобы избежать жадного соответствия. –

1

проверить это

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="chap/text()" name="tokenize"> 
    <xsl:param name="separator" select="'&gt;'"/> 
    <xsl:for-each select="tokenize(.,$separator)"> 
      <p> 
       <xsl:value-of select="normalize-space(.)"/>&gt; 
      </p> 
    </xsl:for-each> 
</xsl:template> 

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