Xml 用于重命名父节点和子节点的Xslt转换
我正在使用xsl模板为标记名添加一个计数器。但是下面的模板没有按预期工作Xml 用于重命名父节点和子节点的Xslt转换,xml,xslt,Xml,Xslt,我正在使用xsl模板为标记名添加一个计数器。但是下面的模板没有按预期工作 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" /> <!-- identity template --> <xsl:template match="node()|@*">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="MAINS">
<xsl:copy>
<xsl:apply-templates select="*[not(self::MAIN)]" />
<xsl:apply-templates select="MAIN" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(local-name(), 'MAINS/MAIN')]">
<xsl:copy>
<xsl:apply-templates select="SUBMAIN" />
</xsl:copy>
</xsl:template>
<xsl:template match="//SUBMAINS">
<xsl:copy>
<xsl:apply-templates select="*[not(self::SUBMAIN)]" />
<xsl:apply-templates select="SUBMAIN" />
</xsl:copy>
</xsl:template>
<xsl:template match="MAIN|SUBMAIN">
<xsl:element name="{concat(local-name(),position())}">
<xsl:copy-of select="*" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输入如下:
<TEST>
<TAG1>
xyz
</TAG1>
<MAINS>
<MAIN>
<DAT>abc</DAT>
<SUBMAIN>
<DAT2>123</DAT2>
</SUBMAIN>
<SUBMAIN>
<DAT2>456</DAT2>
</SUBMAIN>
</MAIN>
<MAIN>
<DAT>pqr</DAT>
<SUBMAIN>
<DAT2>123</DAT2>
</SUBMAIN>
<SUBMAIN>
<DAT2>789</DAT2>
</SUBMAIN>
</MAIN>
<MAIN>
<DAT>mno</DAT>
</MAIN>
</MAINS>
<SUBMAINS>
<SUBMAIN>
<DAT2>789</DAT2>
<DAT3>sfsfd</DAT3>
</SUBMAIN>
<SUBMAIN>
<DAT2>789</DAT2>
<DAT3>dsdsd</DAT3>
</SUBMAIN>
</SUBMAINS>
</TEST>
xyz
abc
123
456
pqr
123
789
mno
789
SFD
789
DSD
预期输出如下,其中标签submin或MAIN应重命名为submin或MAIN,并附加索引/位置:
<TEST>
<TAG1>
xyz
</TAG1>
<MAINS>
<MAIN1>
<DAT>abc</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>456</DAT2>
</SUBMAIN2>
</MAIN1>
<MAIN2>
<DAT>pqr</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
</SUBMAIN2>
</MAIN2>
<MAIN3>
<DAT>mno</DAT>
</MAIN3>
</MAINS>
<SUBMAINS>
<SUBMAIN1>
<DAT2>789</DAT2>
<DAT3>sfsfd</DAT3>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
<DAT3>dsdsd</DAT3>
</SUBMAIN2>
</SUBMAINS>
</TEST>
xyz
abc
123
456
pqr
123
789
mno
789
SFD
789
DSD
但实际产出是:
<TEST>
<TAG1>
xyz
</TAG1>
<MAINS>
<MAIN1>
<DAT>abc</DAT>
<SUBMAIN>
<DAT2>123</DAT2>
</SUBMAIN>
<SUBMAIN>
<DAT2>456</DAT2>
</SUBMAIN>
</MAIN1>
<MAIN2>
<DAT>pqr</DAT>
<SUBMAIN>
<DAT2>123</DAT2>
</SUBMAIN>
<SUBMAIN>
<DAT2>789</DAT2>
</SUBMAIN>
</MAIN2>
<MAIN3>
<DAT>mno</DAT>
</MAIN3>
</MAINS>
<SUBMAINS>
<SUBMAIN1>
<DAT2>789</DAT2>
<DAT3>sfsfd</DAT3>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
<DAT3>dsdsd</DAT3>
</SUBMAIN2>
</SUBMAINS>
</TEST>
xyz
abc
123
456
pqr
123
789
mno
789
SFD
789
DSD
在实际结果中,MAIN下的submin标记没有附加数字。AFAICT,这将返回预期结果: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="MAIN">
<xsl:element name="MAIN{position()}">
<xsl:apply-templates select="*[not(self::SUBMAIN)]"/>
<xsl:apply-templates select="SUBMAIN"/>
</xsl:element>
</xsl:template>
<xsl:template match="SUBMAIN">
<xsl:element name="SUBMAIN{position()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
添加: 你可以用另一种方式来看待它: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="MAIN | SUBMAIN">
<xsl:variable name="n">
<xsl:number/>
</xsl:variable>
<xsl:element name="{name()}{$n}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
首先,此模板永远不会匹配:
<xsl:template match="*[starts-with(local-name(), 'MAINS/MAIN')]">
输出:
<?xml version="1.0" encoding="UTF-8"?>
<TEST>
<TAG1>
xyz
</TAG1>
<MAINS>
<MAIN1>
<DAT>abc</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>456</DAT2>
</SUBMAIN2>
</MAIN1>
<MAIN2>
<DAT>pqr</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
</SUBMAIN2>
</MAIN2>
<MAIN3>
<DAT>mno</DAT>
</MAIN3>
</MAINS>
<SUBMAINS>
<SUBMAIN1>
<DAT2>789</DAT2>
<DAT3>sfsfd</DAT3>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
<DAT3>dsdsd</DAT3>
</SUBMAIN2>
</SUBMAINS>
</TEST>
xyz
abc
123
456
pqr
123
789
mno
789
SFD
789
DSD
注意:两条规则用于重新排序MAIN
和SUBMAIN
child,一条规则用于按“推送”顺序枚举MAIN
和SUBMAIN
元素
附录:枚举元素名称不是一个好主意,因为几乎没有SGML/XML词汇表将此用于同级(HTML中的标题是例外,但它们在线性文本上建模层次结构)
编辑:这是因为我不喜欢推送样式,这是基于上下文(当前节点、当前上下文列表、当前位置)的。它有时使代码错误难以处理。对于“确定性”编号,请使用
xsl:number
1。请也显示输入。2.您的预期输出没有显示您描述的编号。@michael.hor257k感谢您注意到错误。我已经用预期的细节更新了这个问题。我认为子单元
元素也可以对其子元素进行重新排序。事实上,MAINS
元素也是如此。我在网上尝试了转换,但没有得到预期的结果,生成的XML在SUBMAIN标记转换后被截断。我看不到您描述的任何东西:可能是我使用的工具的局限性。谢谢你的意见。这帮了我很大的忙,我想你忽略了一个事实,submin
可以是MAIN
的子对象,也需要在该上下文中编号。
<?xml version="1.0" encoding="UTF-8"?>
<TEST>
<TAG1>
xyz
</TAG1>
<MAINS>
<MAIN1>
<DAT>abc</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>456</DAT2>
</SUBMAIN2>
</MAIN1>
<MAIN2>
<DAT>pqr</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
</SUBMAIN2>
</MAIN2>
<MAIN3>
<DAT>mno</DAT>
</MAIN3>
</MAINS>
<SUBMAINS>
<SUBMAIN1>
<DAT2>789</DAT2>
<DAT3>sfsfd</DAT3>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
<DAT3>dsdsd</DAT3>
</SUBMAIN2>
</SUBMAINS>
</TEST>