我有以下XML文档,我想使用XSLT进行转换。
输入:
<ABS>
<B>Heading 1</B>
text
<B>Heading 2</B>
text
<B>Heading 3</B>
text
<B>Heading 4</B>
text
</ABS>
我需要编写一个转换,以便每个标题及其后续文本都包含在<sec>
标记中,如下面的示例所示。
期望输出:
<ABS>
<sec>
<B>Heading 1</B>
text
</sec>
<sec>
<B>Heading 2</B>
text
</sec>
<sec>
<B>Heading 3</B>
text
</sec>
<sec>
<B>Heading 4</B>
text
</sec>
</ABS>
有人知道我如何使用XSLT样式表来做到这一点吗?
由于
答案 0 :(得分:1)
请在下面找到XSLT:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="ABS">
<xsl:copy>
<xsl:for-each select="B">
<sec><xsl:copy-of select="."/><xsl:value-of select="following-sibling::text()[1]"/></sec>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
这是你的解决方案:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="ABS">
<ABS>
<xsl:apply-templates/>
</ABS>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="name()='B'">
<sec>
<xsl:copy-of select="."/>
<xsl:value-of select="following-sibling::text()[1]"/>
</sec>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:copy-of select="."/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
答案 2 :(得分:0)
试试这个:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B">
<sec>
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
<xsl:value-of select="following-sibling::text()[1]"/>
</sec>
</xsl:template>
<xsl:template match="text()[preceding::*[name()='B']]">
</xsl:template>
</xsl:stylesheet>
将生成以下输出:
<?xml version="1.0"?>
<ABS>
<sec><B>Heading 1</B>
text
</sec><sec><B/>
text
</sec><sec><B/>
text
</sec><sec><B/>
text
</sec></ABS>