我有一个以下的XML。我想获得Title元素的文本值。我使用过<xsl:value-of select="Title/text()"/>
,但它没有获取输出。
XML-
<Section>
<Chapter>
<Title>
<Marker>MarkerText1</Marker>some text1
</Title>
</Chapter>
<Chapter>
<Title>
<Marker>MarkerText2</Marker>sometext2
<Marker>MarkerText3</Marker>some text3
</Title>
</Chapter>
</Section>
我在XSL下面使用过,但它没有获取任何结果。当我使用Title/text()[last()]
时,它会给出最后一个值。我的意思是text()[last()]
正在运作,但不仅仅是text()
<xsl:template match="/Section/Chapter">
<xsl:value-of select="Title/text()"/>
</xsl:template>
输出应包含:
<Title>some text1</Title><Title>some text2 sometext3</Title>
答案 0 :(得分:0)
我不确定“文本值”是什么意思,但是如果你的意思与规范称之为“字符串值”的意思相同,那么使用
<xsl:value-of select="Title"/>
如果那不是您想要的,那么您需要更清楚地解释您想要的输出。
答案 1 :(得分:0)
如果您正在使用XSLT 1.0,那么value-of
节点集是文档顺序中第一个节点的字符串值。所以
<xsl:value-of select="Title/text()"/>
将为您提供当前上下文节点下 first (仅在此情况下)Title
元素下的第一个子文本节点的值。对于示例中的Chapter
元素,这将是开始<Title>
标记与开始<Marker>
标记之间的文本节点,该标记由单个换行符组成。
XSLT 2.0不同,在这种情况下,value-of
将为您提供所有所选节点的值(以空格分隔),第一个Chapter
这将是换行符,空间,一些text1,换行符。
答案 2 :(得分:0)
此XML输入:
<?xml version="1.0" encoding="utf-8"?>
<Section>
<Chapter>
<Title>
<Marker>MarkerText1</Marker>some text1
</Title>
</Chapter>
<Chapter>
<Title>
<Marker>MarkerText2</Marker>some text2
<Marker>MarkerText3</Marker>some text3
</Title>
</Chapter>
</Section>
提供给此XSLT转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<Titles>
<xsl:apply-templates/>
</Titles>
</xsl:template>
<xsl:template match="Title">
<Title><xsl:apply-templates select="text()"/></Title>
</xsl:template>
<xsl:template match="Title/text()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
产生此XML输出:
<?xml version="1.0" encoding="UTF-8"?>
<Titles>
<Title>some text1
</Title>
<Title>some text2
some text3
</Title>
</Titles>
说明:
match="/"
模板为生成的元素建立根元素
Title
元素。 (你提到的Title
元素的无根序列
你的问题不是格式良好的XML。)match="Title"
模板生成请求的Title
元素
并在包含的text()
节点上应用模式匹配。match="Title/text()
模板复制文本节点
输入XML中Title
元素的子元素。如果您希望输出看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Titles>
<Title>some text1</Title>
<Title>some text2 some text3</Title>
</Titles>
您可以将这个稍微复杂的模板用于match="Title/text()"
:
<xsl:template match="Title/text()">
<xsl:if test="preceding-sibling::text()">
<xsl:text> </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space()"/>
</xsl:template>