Нормализованное пространство в xslt - PullRequest
0 голосов
/ 28 июня 2018

Пока мы используем нормализованное пространство в xslt, дочерние элементы / теги автоматически удаляются. Если я не хочу удалять определенный дочерний тег, что мне использовать?

Код:

<mixed-citation publication-type="book">
<collab>Panel on Antiretroviral Guidelines for Adults and Adolescents</collab>
. 
<source>
Guidelines for the use of antiretroviral agents in HIV-1-infected adults and adolescents
</source>
. 
<publisher-loc>Rockville, MD</publisher-loc>
 : 
<publisher-name>US Department of Health and Human Services (DHHS)</publisher-name>; May 
<year>2014</year> [regularly updated]. [
<uri xlink:href="http://aidsinfo.nih.gov/guidelines/html/1/adult-and-adolescent-arv-guidelines/0">URL</uri>]
</mixed-citation>
</ref>

XSLT код:

<xsl:template match = "mixed-citation">
<xsl:element name = "p">
<xsl:value-of select="normalize-space()"/>
</xsl:element>
</xsl:template>

В приведенном выше коде я хочу напечатать все текстовые значения и удалить все теги, кроме тега . Пожалуйста, помогите !!!

1 Ответ

0 голосов
/ 28 июня 2018

Если вы хотите пропустить элементы-потомки и скопировать определенный элемент, у вас есть две опции, используйте xsl:mode on-no-match="shallow-skip" по умолчанию, а затем напишите шаблон для uri элементов, которые будут скопированы:

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

  <xsl:mode on-no-match="shallow-skip"/>

  <xsl:template match="mixed-citation">
      <p>
          <xsl:apply-templates/>
      </p>
  </xsl:template>

  <xsl:template match="mixed-citation//text()">
      <xsl:value-of select="normalize-space()"/>
  </xsl:template>

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

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / eiZQaFi

или используйте shallow-copy в качестве значения по умолчанию, а затем убедитесь, что вы переопределите его для descendants, отличного от uri:

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

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="mixed-citation">
      <p>
          <xsl:apply-templates/>
      </p>
  </xsl:template>

  <xsl:template match="mixed-citation//text()">
      <xsl:value-of select="normalize-space()"/>
  </xsl:template>

  <xsl:template match="mixed-citation//*[not(self::uri)]">
      <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / eiZQaFi / 1

Если вы используете более ранние версии, тогда текущую версию 3 XSLT смотрите в https://www.w3.org/TR/xslt-30/#built-in-templates-shallow-skip о том, как используемые объявления xsl:mode преобразуются в шаблоны, например. вместо

  <xsl:mode on-no-match="shallow-skip"/>

вы можете использовать

  <xsl:template match="*"><xsl:apply-templates/></xsl:template>

и shallow-copy преобразуется в известный шаблон преобразования идентификаторов.

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