需要拆分和分配xslt节点
Need to split and distribute xslt nodes
需要使用 XSLT 2.0 或 3.0 转换下面提到的 XML 结构,
来自
<RD>
<RE>
<BI>B00</BI>
<BI>B01</BI>
<BI>B02</BI>
<BI>B03</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B04</BI>
<BI>B05</BI>
<CI>C02</CI>
<D>D02</D>
</RE>
</RD>
对此:
<RD>
<RE>
<BI>B00</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B01</BI>
<CI>C01</CI>
<D>D01</DI>
</RE>
<RE>
<BI>B02</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B03</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B04</BI>
<CI>C02</CI>
<D>D02</D>
</RE>
<RE>
<BI>B05</BI>
<CI>C02</CI>
<D>D02</D>
</RE>
</RD>
说明:
我需要在 (RE) 标签
的每次迭代中实现 (CI),(D) 的 XML 节点到每个 (BI) 标签的分布
你可以把它当作一个分组问题:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="RD">
<xsl:copy>
<xsl:for-each-group select="RE" group-by="BI">
<xsl:copy>
<BI>{current-grouping-key()}</BI>
<xsl:apply-templates select="*[not(self::BI)]"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:mode on-no-match="shallow-copy"/>
</xsl:stylesheet>
这也可以像这样简单地解决:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="RD">
<xsl:copy>
<xsl:apply-templates select="RE/BI"/>
</xsl:copy>
</xsl:template>
<xsl:template match="BI">
<RE>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::CI"/>
<xsl:copy-of select="following-sibling::D"/>
</RE>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="RE">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="BI">
<RE>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::*[not(self::BI)]"/>
</RE>
</xsl:template>
</xsl:stylesheet>
需要使用 XSLT 2.0 或 3.0 转换下面提到的 XML 结构,
来自
<RD>
<RE>
<BI>B00</BI>
<BI>B01</BI>
<BI>B02</BI>
<BI>B03</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B04</BI>
<BI>B05</BI>
<CI>C02</CI>
<D>D02</D>
</RE>
</RD>
对此:
<RD>
<RE>
<BI>B00</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B01</BI>
<CI>C01</CI>
<D>D01</DI>
</RE>
<RE>
<BI>B02</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B03</BI>
<CI>C01</CI>
<D>D01</D>
</RE>
<RE>
<BI>B04</BI>
<CI>C02</CI>
<D>D02</D>
</RE>
<RE>
<BI>B05</BI>
<CI>C02</CI>
<D>D02</D>
</RE>
</RD>
说明: 我需要在 (RE) 标签
的每次迭代中实现 (CI),(D) 的 XML 节点到每个 (BI) 标签的分布你可以把它当作一个分组问题:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="RD">
<xsl:copy>
<xsl:for-each-group select="RE" group-by="BI">
<xsl:copy>
<BI>{current-grouping-key()}</BI>
<xsl:apply-templates select="*[not(self::BI)]"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:mode on-no-match="shallow-copy"/>
</xsl:stylesheet>
这也可以像这样简单地解决:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="RD">
<xsl:copy>
<xsl:apply-templates select="RE/BI"/>
</xsl:copy>
</xsl:template>
<xsl:template match="BI">
<RE>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::CI"/>
<xsl:copy-of select="following-sibling::D"/>
</RE>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="RE">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="BI">
<RE>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::*[not(self::BI)]"/>
</RE>
</xsl:template>
</xsl:stylesheet>