与某些元素的 xsl:value-of 到 select 文本值一起使用的表达式
What expression to use with xsl:value-of to select text value from certain elements
我有这种 XML 结构,我需要打印出两个段落部分包含的内容。怎么做?基本上我考虑了for-each循环,但是在xsl:value-of构造里面放什么?谢谢!
<slideshow>
<slide id="A1">
<title>XML techniques</title>
<paragraph> Slideshow prepresents different kind of <bold>XML</bold> techniques </paragraph>
<paragraph> Most common XML Techniques are </paragraph>
假设您的 XSLT 类似于
<xsl:for-each select="//paragraph">
???
</xsl:for-each>
你可以这样写:
<xsl:for-each select="//paragraph">
<xsl:copy-of select="node()"/>
</xsl:for-each>
...这将 return 作为段落子节点的文本和元素的副本。
根据您还有哪些其他规则想要执行,您还可以这样写:
<xsl:for-each select="//paragraph">
<xsl:apply-templates select="node()"/>
</xsl:for-each>
...这也会 return 节点的副本 - 文本和元素 - 是段落的子项,除非您有其他模板覆盖该行为。
如果您只需要每个段落中的原始文本(即没有粗体标记),您可以使用 value-of
.
<xsl:for-each select="//paragraph">
<xsl:value-of select="."/>
</xsl:for-each>
如果这就是您要做的全部,您甚至可以将其写成:
<xsl:value-of select="//paragraph"/>
(注意:我以 //paragraph 为例,因为没有提供上下文,但您可能想要浏览幻灯片并选择子段落)。
您写道:
Basically I thought about for-each loop,
处理节点时,很少需要 xsl:for-each
。使用 xsl:apply-templates
选择你想要的节点。如果没有匹配的模板,这将默认吐出节点(文本)的值:
<xsl:template match="slide">
<!-- just process selection of children -->
<xsl:apply-templates select="paragraph" />
</xsl:template>
<!-- add this in case you already have an identity template -->
<xsl:template match="paragraph">
<!-- select only the immediate text children (without <b> for instance) -->
<xsl:value-of select="text()" />
<!-- OR: select the value, incl. all children (using "node()" is equiv.) -->
<xsl:value-of select="." />
</xsl:template>
你写道:
but what to put inside xsl:value-of construction? Thanks!
这很大程度上取决于重点。焦点通常由第一个祖先指令 xsl:template
或 xsl:for-each
设置。假设您的焦点是 <slideshow>
,表达式将是:
<xsl:value-of select="slide/paragraph" />
如果焦点已经在paragraph
上,您可以使用select="text()"
(选择所有文本children,但不能更深),或select="."
(选择当前节点, 也取值 children).
但请参阅上文以了解更具弹性的方法。使用 apply-templates 可以更轻松地为更改和可维护性编写代码。
我有这种 XML 结构,我需要打印出两个段落部分包含的内容。怎么做?基本上我考虑了for-each循环,但是在xsl:value-of构造里面放什么?谢谢!
<slideshow>
<slide id="A1">
<title>XML techniques</title>
<paragraph> Slideshow prepresents different kind of <bold>XML</bold> techniques </paragraph>
<paragraph> Most common XML Techniques are </paragraph>
假设您的 XSLT 类似于
<xsl:for-each select="//paragraph">
???
</xsl:for-each>
你可以这样写:
<xsl:for-each select="//paragraph">
<xsl:copy-of select="node()"/>
</xsl:for-each>
...这将 return 作为段落子节点的文本和元素的副本。
根据您还有哪些其他规则想要执行,您还可以这样写:
<xsl:for-each select="//paragraph">
<xsl:apply-templates select="node()"/>
</xsl:for-each>
...这也会 return 节点的副本 - 文本和元素 - 是段落的子项,除非您有其他模板覆盖该行为。
如果您只需要每个段落中的原始文本(即没有粗体标记),您可以使用 value-of
.
<xsl:for-each select="//paragraph">
<xsl:value-of select="."/>
</xsl:for-each>
如果这就是您要做的全部,您甚至可以将其写成:
<xsl:value-of select="//paragraph"/>
(注意:我以 //paragraph 为例,因为没有提供上下文,但您可能想要浏览幻灯片并选择子段落)。
您写道:
Basically I thought about for-each loop,
处理节点时,很少需要 xsl:for-each
。使用 xsl:apply-templates
选择你想要的节点。如果没有匹配的模板,这将默认吐出节点(文本)的值:
<xsl:template match="slide">
<!-- just process selection of children -->
<xsl:apply-templates select="paragraph" />
</xsl:template>
<!-- add this in case you already have an identity template -->
<xsl:template match="paragraph">
<!-- select only the immediate text children (without <b> for instance) -->
<xsl:value-of select="text()" />
<!-- OR: select the value, incl. all children (using "node()" is equiv.) -->
<xsl:value-of select="." />
</xsl:template>
你写道:
but what to put inside xsl:value-of construction? Thanks!
这很大程度上取决于重点。焦点通常由第一个祖先指令 xsl:template
或 xsl:for-each
设置。假设您的焦点是 <slideshow>
,表达式将是:
<xsl:value-of select="slide/paragraph" />
如果焦点已经在paragraph
上,您可以使用select="text()"
(选择所有文本children,但不能更深),或select="."
(选择当前节点, 也取值 children).
但请参阅上文以了解更具弹性的方法。使用 apply-templates 可以更轻松地为更改和可维护性编写代码。