仅通过xslt的元素的文本值

时间:2013-11-12 16:59:33

标签: xslt

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

3 个答案:

答案 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>