2015-09-30 2 views
0

У меня есть этот код:Заменить шаблон XSL

<p>2&ensp;If the patient is unknown to the service a comprehensive assessment must be carried out prior to undertaking the procedure. (Reference <xref target="http://www.google.com" style="unformatted"/>)</p> 

Я хочу это XML, чтобы быть как это:

<p><b>2</b>If the patient is unknown to the service a comprehensive assessment must be carried out prior to undertaking the procedure. (Reference <xref target="http://www.google.com" style="unformatted"/>)</p> 

С помощью XSL 1.0 Я пробовал много способов, чтобы заменить строку, но узел (xref) удаляется !!

+2

Опубликуйте пути, которые вы пробовали, чтобы их можно было отредактировать/просмотреть и зафиксировать –

ответ

2

Если вы написали шаблон с match="p" который делает строку замена, то изменить это, чтобы иметь match="p/text()" (или match="p//text()" если вам нужна замена в потомках тоже), а затем убедитесь, что у вас есть шаблон тождественного преобразования в месте:

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

это мне не ясно, который подстроки именно вы хотите заменить или обернуть с b элементом, пример подхода, предложенного выше в http://xsltransform.net/bnnZVC, он делает

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

<xsl:template name="wrap"> 
    <xsl:param name="string" select="."/> 
    <xsl:param name="search"/> 
    <xsl:param name="wrap-name"/> 
    <xsl:choose> 
     <xsl:when test="not(contains($string, $search))"> 
      <xsl:value-of select="$string"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="substring-before($string, $search)"/> 
      <xsl:element name="{$wrap-name}"> 
       <xsl:value-of select="$search"/> 
      </xsl:element> 
      <xsl:call-template name="wrap"> 
       <xsl:with-param name="string" select="substring-after($string, $search)"/> 
       <xsl:with-param name="search" select="$search"/> 
       <xsl:with-param name="wrap-name" select="$wrap-name"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

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

<xsl:template match="p/text()"> 
    <xsl:call-template name="wrap"> 
     <xsl:with-param name="search" select="'2&#8194;'"/> 
     <xsl:with-param name="wrap-name" select="'b'"/> 
    </xsl:call-template> 
</xsl:template> 

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