2016-02-17 9 views
0

Я пытаюсь вернуть часть строки в лист XML. Я хочу, чтобы сохранить то, что находится в скобках в поле «Описание», и двигаться, что находится вне скобок в другое поле:XSLT возвращает строку между двумя символами

Источник XML:

<Log> 
    <Date>15-Nov-2014</Date> 
    <TC>14:38:47:13</TC> 
    <Description>Move this text (but keep this text here)</Description> 
</Log> 

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

<Log> 
    <Date>15-Nov-2014</Date> 
    <TC>14:38:47:13</TC> 
    <Description>but keep this text here</Description> 
    <MyOtherField>Move this text</MyOtherField> 
</Log> 

Я пробовал использовать функции подстроки перед «(« и «подстрока после») в строке, а результат почти корректен, однако проблема в том, что не все поля «Описание» в моем исходном XML листы имеют текст в скобках, поэтому они удаляются полностью.

Любая помощь будет принята с благодарностью.

Спасибо

+1

«* не все„Описание“полей в моем исходном XML листе есть текст в скобках *» Что такое ожидаемый результат в таком случае? –

+0

Привет, Майкл, спасибо за ответ. В этом случае мы хотим, чтобы «Переместить этот текст» все еще перемещался, поэтому поле «Описание» должно быть пустым. Например: ' 15-Nov-201 14: 38: 47: 13 Переместить этот текст ' – yekootmada

+0

Можете ли вы пост что вы пытались? –

ответ

4

Попробуй так:

<xsl:template match="Description"> 
    <xsl:copy> 
     <xsl:value-of select="substring-before(substring-after(., '('), ')')"/> 
    </xsl:copy> 
    <MyOtherField> 
     <xsl:value-of select="substring-before(concat(., '('), '(')"/> 
    </MyOtherField> 
</xsl:template> 
0

я смог добиться этого, используя следующий шаблон:

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

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

    <xsl:template match="Description[contains(text(), '(')]"> 
     <Description> 
      <xsl:value-of select="substring-before(substring-after(., ' ('), ')')" /> 
     </Description> 
     <MyOtherField> 
      <xsl:value-of select="substring-before(., ' (')" /> 
     </MyOtherField> 
    </xsl:template> 
</xsl:transform> 

Обратите внимание, что он не может работать, как ожидается, если вы имеют несколько ( или ). Идея состоит в том, что вы сопоставляете любые теги Description, которые содержат в них (, а затем используют логику подстроки.

http://xsltransform.net/gWvjQfU

+0

потрясающий - спасибо как за руководство. Я изо всех сил пытаюсь интегрировать это в свой существующий код, созданный MapForce, могли бы вы помочь? Вот ссылка на мой существующий код: [http://xsltransform.net/pPzifq1](http://xsltransform.net/pPzifq1) Для уточнения любой текст в скобках должен оставаться в описании поле, и любой текст вне скобки должен перейти в это поле ключевого слова. '<Ключевое слово типа =" Ключевое слово "> ПЕРЕМЕЩЕНИЕ ЭТОГО ТЕКСТА' – yekootmada

+0

Используйте 'xsl: if' или' xsl: choose' с условием 'test', которое я ставлю в качестве условия' match' в моем втором шаблоне вокруг узлов описания/ключевых слов. –

1

Поскольку вы используете XSLT 2.0, вы можете использовать xsl:analyze-string, чтобы получить текст между ... скобок

XML Input

<Log> 
    <Date>15-Nov-2014</Date> 
    <TC>14:38:47:13</TC> 
    <Description>Move this text (but keep this text here)</Description> 
</Log> 

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="Description"> 
     <xsl:copy> 
     <xsl:analyze-string select="." regex="\(([^)]+)\)"> 
      <xsl:matching-substring> 
      <xsl:value-of select="regex-group(1)"/> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
     </xsl:copy> 
     <MyOtherField> 
     <xsl:value-of select="normalize-space(string-join((substring-before(concat(.,'('),'('), 
      substring-after(.,')')),' '))"/> 
     </MyOtherField>  
    </xsl:template> 

</xsl:stylesheet> 

XML Output

<Log> 
    <Date>15-Nov-2014</Date> 
    <TC>14:38:47:13</TC> 
    <Description>but keep this text here</Description> 
    <MyOtherField>Move this text</MyOtherField> 
</Log> 

Здесь он интегрирован в существующий код: http://xsltransform.net/pPzifq1/1

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