虽然我们在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>
在上面的代码中,我想打印所有文本值并删除除
答案 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
转换为众所周知的身份转换模板。