我正在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: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>
预期的输出如下所示,其中标签SUBMAIN或MAIN应该重命名为SUBMAIN或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>
但是实际输出是:
<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>
在实际结果中,MAIN下的SUBMAIN标签未附加数字。
答案 0 :(得分:0)
AFAICT,这将返回预期结果:
XSLT 1.0
Main
已添加
:这是另一种查看方式:
XSLT 1.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>
答案 1 :(得分:0)
首先,此模板永远不会匹配:
<xsl:template match="*[starts-with(local-name(), 'MAINS/MAIN')]">
那是因为没有NCName可以具有'/'
字符。
第二,此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<!-- 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="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:variable name="position">
<xsl:number/>
</xsl:variable>
<xsl:element name="{local-name()}{$position}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出:
<?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>
注意::两个用于对MAINS
和SUBMAINS
子元素重新排序的规则,一个用于对MAIN
和SUBMAIN
元素进行排序的规则被“推”。
附录:枚举元素名称不是一个好主意,因为几乎没有SGML / XML词汇表使用此来表示同级兄弟(HTML头是例外,但它们是模型线性文本的层次结构)
编辑:这是有原因的,因为我不喜欢推送样式,而是在上下文(当前节点,当前上下文列表,当前位置)上进行中继。有时它会使代码错误变得难以处理。对于“确定性”编号,请使用xsl:number
。