убрать начальные и конечные символы новой строки в xslt - PullRequest
1 голос
/ 07 марта 2012

У меня есть XML с такой структурой:

<xxx>
<yyy>
some text   with spaces inside
</yyy>
<zzz>
another text
</zzz>
</xxx>

Я хочу сгенерировать HTML, который будет отформатирован с пробелом: стиль pre, но я должен удалить символы новой строки из узла yyy и zzz.

Мой вывод должен выглядеть примерно так:

<div><div>some text   with spaces inside</div><div>another text</div></div>

Я пробовал

<xsl:output method="html" indent="no"/>
<xsl:strip-space elements="*"/>

но это не сработало. Символы новой строки все еще там.

Я не могу использовать нормализованное пространство, потому что пробелы между словами важны.

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Следующий XSL удаляет все символы новой строки из элементов yyy и zzz:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:template match="/xxx">
<div>
    <xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="yyy | zzz">
<div>
    <xsl:value-of select="translate(.,'&#x0d;&#x0a;', '')" />
</div>  
</xsl:template>
</xsl:stylesheet>
1 голос
/ 08 марта 2012

Поскольку вы хотите удалить только первый и последний символы из строки, это более простое преобразование делает именно это :

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

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

 <xsl:template match="yyy/text() | zzz/text()">
   <xsl:value-of select="substring(.,2, string-length() -2)"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<xxx>
<yyy>
some text   with spaces inside
</yyy>
<zzz>
another text
</zzz>
</xxx>

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

<xxx>
<yyy>some text   with spaces inside</yyy>
<zzz>another text</zzz>
</xxx>

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

Это можно сделать, если вы используете функцию / шаблон trim() из FXSL :

Демонстрация использования trim():

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="trim.xsl"/>

  <!-- to be applied on trim.xml -->

  <xsl:output method="text"/>
  <xsl:template match="/">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="string(/*)"/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML:

<someText>

   This is    some text   

</someText>

желаемый (обрезанный) результат получается :

'This is    some text'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...