Замена текста после узла - PullRequest
2 голосов
/ 25 марта 2010

Я пытаюсь удалить «Скрыть эти данные» из этого XML, который выполняется с квалификатором type = "noView"

<element version="Local">
   <qualifier name="Public" type="View" /> 
    Good to go 
</element>
<element version="Local">
<qualifier name="Public" type="noView" /> 
     Hide this data
</element>

Я использую этот XSL

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="@*"/>
       <xsl:apply-templates/>
     </xsl:copy>
   </xsl:template>

<xsl:template match="qualifier">
   <xsl:call-template name="replace-noview" />
 </xsl:template>

<xsl:template name="replace-noview">
  <xsl:param name="text" select="@type"/>

  <xsl:choose>
  <xsl:when test="contains($text, 'noView')">
    <xsl:copy-of select="."/>
    <xsl:text>DELETED</xsl:text>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="."/>
  </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

Я получаю вывод

<element identifier="ContactName" version="Local">
<qualifier name="Public" type="View" />
Good to go 
</element>
<element identifier="ContactName" version="Local">
<qualifier name="Public" type="noView" />DELETED 
Hide this data 
</element>

Я соответствую атрибуту noView и могу добавить текст «DELETED». Однако мне нужно удалить следующий текст «Скрыть эти данные».

Я бы хотел получить вывод

<element identifier="ContactName" version="Local">
<qualifier name="Public" type="View" />
Good to go 
</element>
<element identifier="ContactName" version="Local">
<qualifier name="Public" type="noView" />
DELETED 
</element>

Ответы [ 2 ]

2 голосов
/ 25 марта 2010

Это преобразование правильно дает желаемый результат :

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

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

 <xsl:template match="text()
  [preceding-sibling::*[1]/@type='noView']">
  <xsl:text>DELETED</xsl:text>
 </xsl:template>
</xsl:stylesheet>

При применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):

<t>
 <element version="Local">
   <qualifier name="Public" type="View" />
    Good to go
 </element>
 <element version="Local">
 <qualifier name="Public" type="noView" />
     Hide this data
 </element>
</t>

Получен желаемый результат :

<t>
 <element version="Local">
   <qualifier name="Public" type="View">
</qualifier>
    Good to go
 </element>
 <element version="Local">
 <qualifier name="Public" type="noView">
</qualifier>DELETED</element>
</t>

Примечание использование правила идентификации и его переопределения только для текстовых узлов, которые нуждаются в специальной обработке. Использование и переопределение правила идентификации является одним из самых фундаментальных шаблонов проектирования XSLT .

1 голос
/ 25 марта 2010

Предполагая, что элемент может содержать более одного текста ... попробуйте следующую таблицу стилей:

<?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"/>

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

  <xsl:template match="text()">
    <xsl:choose>
      <xsl:when test="preceding-sibling::*[1][local-name() = 'qualifier' and @type='noView']">
    DELETED
  </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

Интервал релевантен для вывода в элементе choose. Так что на выходе все выглядит хорошо.

Если элемент содержит только один текст с префиксом qualifier, стилистика может быть упрощена.

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