3

我有一个下面的 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> 
4

3 回答 3

2

如果您使用的是 XSLT 1.0,则value-ofa 节点集是其第一个节点的字符串值(按文档顺序)。所以

<xsl:value-of select="Title/text()"/>

将为您提供当前上下文节点下第一个(仅在这种情况下)元素下的第一个子文本节点的值。对于您示例中的元素,这将是开始标记和开始标记之间的文本节点,它由单个换行符组成。TitleChapter<Title><Marker>

XSLT 2.0 有所不同,在这种情况下,它value-of会为您提供所有选定节点的值,以空格分隔,首先Chapter这将是换行符、空格、一些 text1、换行符。

于 2013-11-12T17:07:23.323 回答
0

我不确定您所说的“文本值”是什么意思,但如果您的意思与规范所称的“字符串值”相同,请使用

<xsl:value-of select="Title"/>

如果这不是您想要的,那么您需要更清楚地解释您想要的输出。

于 2013-11-12T17:02:56.430 回答
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()
  • 模板复制作为输入 XMLmatch="Title/text()中元素子级的文本节点。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>
于 2013-11-12T23:38:08.227 回答