xslt-1.0 使用 <h1> & <h2> 创建 xml 标签
xslt-1.0 creating xml tags with <h1> & <h2>
我是 xslt 的新手。我想将以下输入转换为输出。我想对 h1 和 h2 元素进行分组,创建属性并在 2 个 h1 或 h2 标签之间添加数据作为子标签值。请帮忙。谢谢。
input.xml
<ATTRIBUTE-VALUE>
<THE-VALUE>
<div xmlns="http://www.w3.org/1999/xhtml">
<h1 dir="ltr" id="_1536217498885">Main Description</h1>
<p>Line1 The main description text goes here.</p>
<p>Line2 The main description text goes here.</p>
<h1 dir="ltr" id="_1536217498886">Steps</h1>
<h2 dir="ltr" id="_1536217498886">Section Name One</h2>
<p>Line1 The steps text goes here.</p>
<ul>Line2 The section description text goes here.</ul>
<h2 dir="ltr" id="_1536217498886">Section Name Two</h2>
<p>Line1 The key consideration text goes here.</p>
<ul><li>Line2 The key consideration text goes here.</li></ul>
<h1 dir="ltr" id="_1536217498887">Skills</h1>
<p>Line1 The Skills text goes here.</p>
<p>Line2 The Skills text goes here.</p>
<p>Line3 The Skills text goes here.</p>
<h1 dir="ltr" id="_1536217498888">Synonyms</h1>
<p>The Synonyms text goes here.</p>
</div>
</THE-VALUE>
</ATTRIBUTE-VALUE>
output.xml
<MainDescription>
<![CDATA[
<p>Line1 The main description text goes here.</p>
<p>Line2 The main description text goes here.</p>
]]>
</MainDescription>
<Section name="Section Name One">
<Description>
<p>Line1 The section text goes here.</p>
<p>Line2 The description text goes here.</p>
</Description>
</Section>
<Section name="Section Name Two">
<Description>
<p>Line1 The description text goes here.</p>
<ul><li>Line2 The description text goes here.</li></ul>
</Description>
</Section>
<Skills>
<p>Line1 The Skills text goes here.</p>
<p>Line2 The Skills text goes here.</p>
<p>Line3 The Skills text goes here.</p>
</Skills>
<Synonyms>
<p>The Synonyms text goes here.</p>
</Synonyms>
我已经使用下面的 xsl 对标签进行分组,但我无法获得 output.xml 所要求的。如果我对 h1 和 h2 都应用相同的模板,我只会得到 xsl 以下的 h1 或 h2 的结果。
xsl 文件:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="xhtml exsl"
version="1.0">
<xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/>
<xsl:output method="xml" indent="yes"
cdata-section-elements="MainDescription KeyConsideration"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="h1-group" match="xhtml:div/*[not(self::xhtml:h1)]" use="generate-id(preceding-sibling::xhtml:h1[1])"/>
<xsl:template match="xhtml:div[xhtml:h1]">
<xsl:apply-templates select="xhtml:h1"/>
</xsl:template>
<xsl:template match="xhtml:h1">
<xsl:element name="{translate(., ' ', '')}">
<xsl:variable name="rtf-with-xhtml-ns-stripped">
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf-with-xhtml-ns-stripped)/node()" mode="xml-to-string"/>
</xsl:element>
</xsl:template>
<xsl:template match="xhtml:p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
</xsl:stylesheet>
我认为您需要为 h2
分组定义第二个键
<xsl:key name="h2-group" match="xhtml:div/*[not(self::xhtml:h2)]" use="generate-id(preceding-sibling::xhtml:h2[1])"/>
然后有第二个模板匹配 h1
组中包含 h2
元素的元素
<xsl:template match="xhtml:h1[key('h1-group', generate-id())[self::xhtml:h2]]">
<xsl:apply-templates select="key('h1-group', generate-id())[self::xhtml:h2]" />
</xsl:template>
然后在匹配 h2
的模板中进行分组
<xsl:template match="xhtml:h2">
<xsl:variable name="h1Group" select="key('h1-group', generate-id(preceding-sibling::xhtml:h1[1]))" />
<Section name="{.}">
<Description>
<xsl:apply-templates select="key('h2-group', generate-id())[count(. | $h1Group) = count($h1Group)]"/>
</Description>
</Section>
</xsl:template>
这里使用 count
是为了确保只有 h2
之后的 h1
元素属于当前 h1
组。
试试这个 XSLT
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="xhtml exsl"
version="1.0">
<xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/>
<xsl:output method="xml" indent="yes" cdata-section-elements="MainDescription KeyConsideration"/>
<xsl:strip-space elements="*"/>
<xsl:key name="h1-group" match="xhtml:div/*[not(self::xhtml:h1)]" use="generate-id(preceding-sibling::xhtml:h1[1])"/>
<xsl:key name="h2-group" match="xhtml:div/*[not(self::xhtml:h2)]" use="generate-id(preceding-sibling::xhtml:h2[1])"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[xhtml:h1]">
<xsl:apply-templates select="xhtml:h1"/>
</xsl:template>
<xsl:template match="xhtml:h1">
<xsl:element name="{translate(., ' ', '')}">
<xsl:choose>
<xsl:when test=". = 'Main Description'">
<xsl:variable name="rtf-with-xhtml-ns-stripped">
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf-with-xhtml-ns-stripped)/node()" mode="xml-to-string"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template match="xhtml:h1[key('h1-group', generate-id())[self::xhtml:h2]]">
<xsl:apply-templates select="key('h1-group', generate-id())[self::xhtml:h2]" />
</xsl:template>
<xsl:template match="xhtml:h2">
<xsl:variable name="h1Group" select="key('h1-group', generate-id(preceding-sibling::xhtml:h1[1]))" />
<Section name="{.}">
<Description>
<xsl:apply-templates select="key('h2-group', generate-id())[count(. | $h1Group) = count($h1Group)]"/>
</Description>
</Section>
</xsl:template>
<xsl:template match="xhtml:p|xhtml:ul|xhtml:li">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我是 xslt 的新手。我想将以下输入转换为输出。我想对 h1 和 h2 元素进行分组,创建属性并在 2 个 h1 或 h2 标签之间添加数据作为子标签值。请帮忙。谢谢。
input.xml
<ATTRIBUTE-VALUE>
<THE-VALUE>
<div xmlns="http://www.w3.org/1999/xhtml">
<h1 dir="ltr" id="_1536217498885">Main Description</h1>
<p>Line1 The main description text goes here.</p>
<p>Line2 The main description text goes here.</p>
<h1 dir="ltr" id="_1536217498886">Steps</h1>
<h2 dir="ltr" id="_1536217498886">Section Name One</h2>
<p>Line1 The steps text goes here.</p>
<ul>Line2 The section description text goes here.</ul>
<h2 dir="ltr" id="_1536217498886">Section Name Two</h2>
<p>Line1 The key consideration text goes here.</p>
<ul><li>Line2 The key consideration text goes here.</li></ul>
<h1 dir="ltr" id="_1536217498887">Skills</h1>
<p>Line1 The Skills text goes here.</p>
<p>Line2 The Skills text goes here.</p>
<p>Line3 The Skills text goes here.</p>
<h1 dir="ltr" id="_1536217498888">Synonyms</h1>
<p>The Synonyms text goes here.</p>
</div>
</THE-VALUE>
</ATTRIBUTE-VALUE>
output.xml
<MainDescription>
<![CDATA[
<p>Line1 The main description text goes here.</p>
<p>Line2 The main description text goes here.</p>
]]>
</MainDescription>
<Section name="Section Name One">
<Description>
<p>Line1 The section text goes here.</p>
<p>Line2 The description text goes here.</p>
</Description>
</Section>
<Section name="Section Name Two">
<Description>
<p>Line1 The description text goes here.</p>
<ul><li>Line2 The description text goes here.</li></ul>
</Description>
</Section>
<Skills>
<p>Line1 The Skills text goes here.</p>
<p>Line2 The Skills text goes here.</p>
<p>Line3 The Skills text goes here.</p>
</Skills>
<Synonyms>
<p>The Synonyms text goes here.</p>
</Synonyms>
我已经使用下面的 xsl 对标签进行分组,但我无法获得 output.xml 所要求的。如果我对 h1 和 h2 都应用相同的模板,我只会得到 xsl 以下的 h1 或 h2 的结果。
xsl 文件:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="xhtml exsl"
version="1.0">
<xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/>
<xsl:output method="xml" indent="yes"
cdata-section-elements="MainDescription KeyConsideration"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="h1-group" match="xhtml:div/*[not(self::xhtml:h1)]" use="generate-id(preceding-sibling::xhtml:h1[1])"/>
<xsl:template match="xhtml:div[xhtml:h1]">
<xsl:apply-templates select="xhtml:h1"/>
</xsl:template>
<xsl:template match="xhtml:h1">
<xsl:element name="{translate(., ' ', '')}">
<xsl:variable name="rtf-with-xhtml-ns-stripped">
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf-with-xhtml-ns-stripped)/node()" mode="xml-to-string"/>
</xsl:element>
</xsl:template>
<xsl:template match="xhtml:p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
</xsl:stylesheet>
我认为您需要为 h2
分组定义第二个键
<xsl:key name="h2-group" match="xhtml:div/*[not(self::xhtml:h2)]" use="generate-id(preceding-sibling::xhtml:h2[1])"/>
然后有第二个模板匹配 h1
组中包含 h2
元素的元素
<xsl:template match="xhtml:h1[key('h1-group', generate-id())[self::xhtml:h2]]">
<xsl:apply-templates select="key('h1-group', generate-id())[self::xhtml:h2]" />
</xsl:template>
然后在匹配 h2
的模板中进行分组
<xsl:template match="xhtml:h2">
<xsl:variable name="h1Group" select="key('h1-group', generate-id(preceding-sibling::xhtml:h1[1]))" />
<Section name="{.}">
<Description>
<xsl:apply-templates select="key('h2-group', generate-id())[count(. | $h1Group) = count($h1Group)]"/>
</Description>
</Section>
</xsl:template>
这里使用 count
是为了确保只有 h2
之后的 h1
元素属于当前 h1
组。
试试这个 XSLT
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="xhtml exsl"
version="1.0">
<xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/>
<xsl:output method="xml" indent="yes" cdata-section-elements="MainDescription KeyConsideration"/>
<xsl:strip-space elements="*"/>
<xsl:key name="h1-group" match="xhtml:div/*[not(self::xhtml:h1)]" use="generate-id(preceding-sibling::xhtml:h1[1])"/>
<xsl:key name="h2-group" match="xhtml:div/*[not(self::xhtml:h2)]" use="generate-id(preceding-sibling::xhtml:h2[1])"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[xhtml:h1]">
<xsl:apply-templates select="xhtml:h1"/>
</xsl:template>
<xsl:template match="xhtml:h1">
<xsl:element name="{translate(., ' ', '')}">
<xsl:choose>
<xsl:when test=". = 'Main Description'">
<xsl:variable name="rtf-with-xhtml-ns-stripped">
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf-with-xhtml-ns-stripped)/node()" mode="xml-to-string"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template match="xhtml:h1[key('h1-group', generate-id())[self::xhtml:h2]]">
<xsl:apply-templates select="key('h1-group', generate-id())[self::xhtml:h2]" />
</xsl:template>
<xsl:template match="xhtml:h2">
<xsl:variable name="h1Group" select="key('h1-group', generate-id(preceding-sibling::xhtml:h1[1]))" />
<Section name="{.}">
<Description>
<xsl:apply-templates select="key('h2-group', generate-id())[count(. | $h1Group) = count($h1Group)]"/>
</Description>
</Section>
</xsl:template>
<xsl:template match="xhtml:p|xhtml:ul|xhtml:li">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>