Xml XSLT:用另一个标记包装一个节点和后面的文本节点
下面是我想要使用XSLT转换的XML文档 输入:Xml XSLT:用另一个标记包装一个节点和后面的文本节点,xml,xslt,xpath,Xml,Xslt,Xpath,下面是我想要使用XSLT转换的XML文档 输入: <ABS> <B>Heading 1</B> text <B>Heading 2</B> text <B>Heading 3</B> text <B>Heading 4</B> text </ABS> <ABS> <sec> <B>Head
<ABS>
<B>Heading 1</B>
text
<B>Heading 2</B>
text
<B>Heading 3</B>
text
<B>Heading 4</B>
text
</ABS>
<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>
标题1
文本
标题2
文本
标题3
文本
标题4
文本
我需要编写一个转换,以便将每个标题及其后面的文本包装在
标记中,如下面的示例所示
所需输出:
<ABS>
<B>Heading 1</B>
text
<B>Heading 2</B>
text
<B>Heading 3</B>
text
<B>Heading 4</B>
text
</ABS>
<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>
标题1
文本
标题2
文本
标题3
文本
标题4
文本
有人知道我如何使用XSLT样式表实现这一点吗
谢谢这是您的解决方案:
<?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>
请在下面找到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>
试试这个:
<?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>
标题1
文本
文本
文本
文本
这符合问题,但仅当ABAS的子节点只有B节点和文本节点时才起作用