Xml 捕获';半';-标记文本
很抱歉格式化为“长期潜伏者,第一次海报” 我和另一个程序员一直在研究这个问题,并尝试了许多排列。我想捕捉的是最后一行“这是酒吧外未标记的文本”。。。 不确定如何更好地描述标记,但我收到的XML块结构如下:Xml 捕获';半';-标记文本,xml,xslt-2.0,Xml,Xslt 2.0,很抱歉格式化为“长期潜伏者,第一次海报” 我和另一个程序员一直在研究这个问题,并尝试了许多排列。我想捕捉的是最后一行“这是酒吧外未标记的文本”。。。 不确定如何更好地描述标记,但我收到的XML块结构如下: <?xml version="1.0" encoding="UTF-8"?> <text> <inlineTag name="bar"> <inlineTag name="text"> <in
<?xml version="1.0" encoding="UTF-8"?>
<text>
<inlineTag name="bar">
<inlineTag name="text">
<inlineTag name="strong">
THIS IS A SIDEBAR BOX
</inlineTag>
</inlineTag>`
<break type="paragraph"/>
<break type="paragraph"/>
This is untagged text inside bar.
</inlineTag>
This is untagged text outside bar
</text>
这是一个侧边栏框
`
这是条内未标记的文本。
这是酒吧外未标记的文本
我针对以下xslt运行它:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template name="Untagged_Bar" match="text()[parent::node()/@name='bar']">
<xsl:choose>
<xsl:when test="self::text() and string-length(.) > 0">
<xsl:element name="p">
<xsl:attribute name="class" select="'k4text'"/>
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="bold" match="//inlineTag[@name='strong']">
<xsl:element name="strong">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
我得到了这个,这几乎就是我想要的
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p class="k4text">
</p>
<strong>
THIS IS A SIDEBAR BOX
</strong>
<p class="k4text">
</p>
<p class="k4text">
</p>
<p class="k4text">
This is untagged text inside bar.
</p>
This is untagged text outside bar
</root>
这是一个侧边栏框
这是条内未标记的文本。
这是酒吧外未标记的文本
我想要的更像这样:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p class="k4text">
<strong>
THIS IS A SIDEBAR BOX
</strong>
</p>
<p class="k4text">
This is untagged text inside bar.
</p>
<p class="k4text">
This is untagged text outside bar
</p>
</root>
这是一个侧边栏框
这是条内未标记的文本。
这是酒吧外未标记的文本
我错过了什么?我有另一个xslt人员在这里工作,我们尝试了许多排列,这是我们能得到的最接近的排列,但我们仍然不能持久
<p class="k4text">
This is untagged text outside bar
</p>
这是酒吧外未标记的文本
说得对。。。非常感谢您的任何想法/帮助/建议 以下是我的建议:
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="//text()[normalize-space()]"/>
</root>
</xsl:template>
<xsl:template match="text()">
<xsl:variable name="current-text" select="."/>
<xsl:apply-templates select="/*" mode="h">
<xsl:with-param name="current-text" select="$current-text" tunnel="yes"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="*" mode="h">
<xsl:param name="current-text" tunnel="yes"/>
<xsl:apply-templates select="node()[descendant-or-self::node() intersect $current-text]" mode="h"/>
</xsl:template>
<xsl:template match="inlineTag[@name = 'strong']" mode="h">
<xsl:param name="current-text" tunnel="yes"/>
<strong>
<xsl:apply-templates select="node()[descendant-or-self::node() intersect $current-text]" mode="h"/>
</strong>
</xsl:template>
<xsl:template match="*[@name = 'bar']" mode="h">
<xsl:param name="current-text" tunnel="yes"/>
<p class="k4text">
<xsl:apply-templates select="node()[descendant-or-self::node() intersect $current-text]" mode="h"/>
</p>
</xsl:template>
<xsl:template match="text()[not(ancestor::*[@name = 'bar'])]" mode="h">
<p class="k4text">
<xsl:value-of select="."/>
</p>
</xsl:template>
</xsl:stylesheet>
输出应该是相同的,但代码应该更高效。我编辑了我的答案,以提供一个不同的、更高效的解决方案。
<?xml version="1.0" encoding="UTF-8"?>
<text>
<inlineTag name="bar">
<inlineTag name="text">
<inlineTag name="strong">
THIS IS A SIDEBAR BOX
</inlineTag>
</inlineTag>
<break type="paragraph"/>
<break type="paragraph"/>
This is untagged text inside bar.
</inlineTag>
This is untagged text outside bar
</text>
<root>
<p class="k4text">
<strong>
THIS IS A SIDEBAR BOX
</strong>
</p>
<p class="k4text">
This is untagged text inside bar.
</p>
<p class="k4text">
This is untagged text outside bar
</p>
</root>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="//text()[normalize-space()]"/>
</root>
</xsl:template>
<xsl:template match="text()">
<xsl:variable name="nodes" select="ancestor-or-self::node() except /"/>
<xsl:apply-templates select="$nodes[1]" mode="h">
<xsl:with-param name="remaining-nodes" select="$nodes[position() gt 1]" tunnel="yes"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="*" mode="h">
<xsl:param name="remaining-nodes" tunnel="yes"/>
<xsl:apply-templates select="$remaining-nodes[1]" mode="h">
<xsl:with-param name="remaining-nodes" select="$remaining-nodes[position() gt 1]" tunnel="yes"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="inlineTag[@name = 'strong']" mode="h">
<xsl:param name="remaining-nodes" tunnel="yes"/>
<strong>
<xsl:apply-templates select="$remaining-nodes[1]" mode="h">
<xsl:with-param name="remaining-nodes" select="$remaining-nodes[position() gt 1]" tunnel="yes"/>
</xsl:apply-templates>
</strong>
</xsl:template>
<xsl:template match="*[@name = 'bar']" mode="h">
<xsl:param name="remaining-nodes" tunnel="yes"/>
<p class="k4text">
<xsl:apply-templates select="$remaining-nodes[1]" mode="h">
<xsl:with-param name="remaining-nodes" select="$remaining-nodes[position() gt 1]" tunnel="yes"/>
</xsl:apply-templates>
</p>
</xsl:template>
<xsl:template match="text()[not(ancestor::*[@name = 'bar'])]" mode="h">
<p class="k4text">
<xsl:value-of select="."/>
</p>
</xsl:template>
</xsl:stylesheet>