2016-04-14 2 views
0

Вход:XSL: Заменить значение внутри тега

<Remarks>Random data## B2B## abc,controls,free text ## B2B## random data</Remarks> 

XSL должен заменить

"## B2B ## азбука, управления, свободный текст ## B2B ##"

в Замечаний тег с

«значению1: азбука, value2: управления, значение 3: свободный текст»

Желаемый результат:

<Remarks>Random data,value1:abc,value2:controls,value3:free text,random data</Remarks> 

Примечание: значения внутри ## B2B## тегов неизвестны и изменить каждый раз, пока я дал выборочные значения.

+0

Было бы полезно предоставить нам некоторые образцы изменяющихся значений. Пока что это просто стреляет в темноту. Например: может быть значение с именем 'value1'. Какую ценность следует заменить? И каковы его разделители? До сих пор я предполагаю, что у вас есть три строки '' между строками '## B2B ##', которые ограничены символом (возможно, ',') и должны быть заменены другим набором из трех строк. Как складываются эти другие струны? – zx485

+0

Пожалуйста, не изменяйте свои вопросы значительно после ответа. –

ответ

0

Предполагая, что всегда будет ровно один «заполнитель» разграничены ## B2B##, и что он всегда будет содержать точно 3 «токенами» с разделителями-запятыми, вы можете сделать это довольно просто:

<xsl:template match="Remarks"> 
    <xsl:copy> 
     <xsl:value-of select="substring-before(., '## B2B##')" /> 

     <xsl:variable name="placeholder" select="substring-before(substring-after(., '## B2B##'), '## B2B##')" /> 
     <xsl:text> value1: </xsl:text> 
     <xsl:value-of select="substring-before($placeholder, ',')" /> 
     <xsl:text> value2: </xsl:text> 
     <xsl:value-of select="substring-before(substring-after($placeholder, ','), ',')" /> 
     <xsl:text> value3: </xsl:text> 
     <xsl:value-of select="substring-after(substring-after($placeholder, ','), ',')" /> 

     <xsl:value-of select="substring-after(substring-after(., '## B2B##'), '## B2B##')" /> 
    </xsl:copy> 
</xsl:template> 
0

Это решение несколько сложное. Он использует один шаблон для извлечения строки между тегами и другой для разделения этой строки разделителем. Какую строку заменяет другая строка, переданная в другой файл, содержащий сопоставление (replacement.xml). Поскольку XSLT-1.0 возвращает RTF (результирующие фрагменты дерева) в переменных, замена жестко закодирована в шаблоне. В XSLT-2.0 вы можете использовать переменную, которая делает решение более гибким.

Вот это replacement.xml, содержащие отображения:

<?xml version="1.0" encoding="UTF-8"?> 
<replacement> 
    <r src="abc">value1</r> 
    <r src="controls">value2</r> 
    <r src="free text">value3</r> 
</replacement> 

а также XSLT включения этих отображений в строку:

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

    <xsl:template match="/lines/Remarks"> 
     <xsl:variable name="tagName" select="'## B2B##'" /> 
     <xsl:variable name="subStrToReplace"> 
     <xsl:call-template name="strInTag"> 
      <xsl:with-param name="str" select="text()" /> 
      <xsl:with-param name="tagName" select="$tagName" /> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:variable name="replacementString"> 
     <xsl:call-template name="splitAndReplace"> 
      <xsl:with-param name="pText" select="$subStrToReplace" /> 
     </xsl:call-template> 
     </xsl:variable> 
     <Remarks> 
     <xsl:value-of select="concat(normalize-space(substring-before(text(),$tagName)), ',',$replacementString, normalize-space(substring-after(substring-after(text(),$tagName),$tagName)))" /> 
     </Remarks> 
    </xsl:template> 

    <xsl:template name="strInTag"> 
     <xsl:param name="str" /> 
     <xsl:param name="tagName" /> 
     <xsl:value-of select="normalize-space(substring-before(substring-after($str,$tagName),$tagName))" /> 
    </xsl:template> 

    <xsl:template name="splitAndReplace"> 
     <xsl:param name="pText"/> 
     <xsl:if test="string-length($pText) > 0"> 
     <xsl:variable name="vNextItem" select="substring-before(concat($pText, ','), ',')"/> 
     <xsl:value-of select="concat($vNextItem,':',document('replacement.xml')/replacement/r[@src = $vNextItem]/text(),',')"/> 
     <xsl:call-template name="splitAndReplace"> 
      <xsl:with-param name="pText" select="substring-after($pText, ',')"/> 
     </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы