xslt中的规范化空间

时间:2018-06-28 06:34:35

标签: xslt

虽然我们在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 :(得分:1)

如果要跳过后代元素并复制某个元素,则有两个选择,请使用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

如果您使用的是较早的版本,则使用当前的XSLT版本3,然后参见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转换为众所周知的身份转换模板。