Не отображать некоторый текст в узле xml - PullRequest
1 голос
/ 13 декабря 2011

У меня есть XML-документ, в котором есть узел, содержащий правильное имя, затем черту (-), за которой следует описание.Я хочу отображать только правильное имя.

<productroot>
   <name>Proper name - lots of text not relevant to my display.</name>
</productroot>

Спасибо

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Вот полное решение :

<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=
  "name/text()[contains(., ' -')]">
  <xsl:value-of select="substring-before(., ' -')"/>
 </xsl:template>
</xsl:stylesheet>

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

<productroot>
    <name>Proper name1 - Irrelevant 1</name>
    <name>Proper name2 - Irrelevant 2</name>
    <name>Proper name3 - Irrelevant 3</name>
    <name>Proper name4 - Irrelevant 4</name>
    <name>Proper name5 - Irrelevant 5</name>
</productroot>

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

<productroot>
   <name>Proper name1</name>
   <name>Proper name2</name>
   <name>Proper name3</name>
   <name>Proper name4</name>
   <name>Proper name5</name>
</productroot>

Объяснение :

  1. Переопределение правило идентификации .

  2. Использование стандартных функций XPath contains() и substring-before().

0 голосов
/ 13 декабря 2011

Вот опция XSLT 2.0 с использованием tokenize()

<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="name/text()">
    <xsl:value-of select="normalize-space(tokenize(.,'-')[1])"/>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 13 декабря 2011

Предполагая, что элемент name является текущим узлом:

normalize-space(substring-before(., '-'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...