XSL 位置计算不正确
XSL Position doesn't count correctly
我已经尝试了几天来解决这个 XML 转换问题。
我需要通过 XSLT 文件向 XML 标签添加带有序号的“标识符”属性。
我需要指定 XSLT 版本是 1.0。
P.S。该代码以前在 Internet Explorer 上运行,但转换是通过 JavaScript 进行的,由于需要更新的浏览器支持,我现在不能这样做。对于任何询问的人来说,这是客户不想更改的一段非常古老的代码。
我也尝试通过外部文件调用脚本,但也没有用。
这就是 XSL:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:attribute name="identifier">
<xsl:value-of select = "position()" />
</xsl:attribute>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
你有 XML 而不是:
<?xml version="1.0" ?>
<root>
<topic codice="02220020070748129" coobbligati="0" coobbligatiInfo="Unico Intestatario" status="0" statusWorkInProgress="0" imp1="22285" imp2="0" messaggio="" code="0">
<fDi>-1</fDi>
<art>
<comp message="" code="0" importo="22285" numero="14" flag="0" messageEcc="" codeEcc="0"/>
<def message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
<sel message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
</art>
<datascad>0</datascad>
<orig>0</orig>
<sosp>0</sosp>
</topic>
</root>
现在,在示例中使用 XSLT 结果肯定是错误的,计算属性和标记关闭的数量。
下面的一个例子:
<?xml version="1.0"?>
<root identifier="1">
<topic identifier="2" codice="02220020070748129" coobbligati="0" coobbligatiInfo="Unico Intestatario" status="0" statusWorkInProgress="0" imp1="22285" imp2="0" messaggio="" code="0">
<fDi identifier="11">-1</fDi>
<art identifier="13">
<comp identifier="2" message="" code="0" importo="22285" numero="14" flag="0" messageEcc="" codeEcc="0"/>
<def identifier="4" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
<sel identifier="6" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
</art>
<datascad identifier="15">0</datascad>
<orig identifier="17">0</orig>
<sosp identifier="19">0</sosp>
</topic>
</root>
相反,我需要的结果如下:
<?xml version="1.0"?>
<root identifier="1">
<topic identifier="2" codice="02220020070748129" coobbligati="0" coobbligatiInfo="Unico Intestatario" status="0" statusWorkInProgress="0" imp1="22285" imp2="0" messaggio="" code="0">
<fDi identifier="3">-1</fDi>
<art identifier="4">
<comp identifier="5" message="" code="0" importo="22285" numero="14" flag="0" messageEcc="" codeEcc="0"/>
<def identifier="6" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
<sel identifier="7" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
</art>
<datascad identifier="8">0</datascad>
<orig identifier="9">0</orig>
<sosp identifier="10">0</sosp>
</topic>
</root>
提前感谢大家的贡献。
你的方法有两个问题:
您正在为 XML 文档中的每个 节点(元素、属性、文本)分配标识符);
position(
) 函数在当前上下文中起作用,而不是在整个 XML 文档中起作用。
我猜你想做:
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="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:attribute name="identifier">
<xsl:number count="*" level="any"/>
</xsl:attribute>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我已经尝试了几天来解决这个 XML 转换问题。 我需要通过 XSLT 文件向 XML 标签添加带有序号的“标识符”属性。 我需要指定 XSLT 版本是 1.0。 P.S。该代码以前在 Internet Explorer 上运行,但转换是通过 JavaScript 进行的,由于需要更新的浏览器支持,我现在不能这样做。对于任何询问的人来说,这是客户不想更改的一段非常古老的代码。 我也尝试通过外部文件调用脚本,但也没有用。
这就是 XSL:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:attribute name="identifier">
<xsl:value-of select = "position()" />
</xsl:attribute>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
你有 XML 而不是:
<?xml version="1.0" ?>
<root>
<topic codice="02220020070748129" coobbligati="0" coobbligatiInfo="Unico Intestatario" status="0" statusWorkInProgress="0" imp1="22285" imp2="0" messaggio="" code="0">
<fDi>-1</fDi>
<art>
<comp message="" code="0" importo="22285" numero="14" flag="0" messageEcc="" codeEcc="0"/>
<def message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
<sel message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
</art>
<datascad>0</datascad>
<orig>0</orig>
<sosp>0</sosp>
</topic>
</root>
现在,在示例中使用 XSLT 结果肯定是错误的,计算属性和标记关闭的数量。 下面的一个例子:
<?xml version="1.0"?>
<root identifier="1">
<topic identifier="2" codice="02220020070748129" coobbligati="0" coobbligatiInfo="Unico Intestatario" status="0" statusWorkInProgress="0" imp1="22285" imp2="0" messaggio="" code="0">
<fDi identifier="11">-1</fDi>
<art identifier="13">
<comp identifier="2" message="" code="0" importo="22285" numero="14" flag="0" messageEcc="" codeEcc="0"/>
<def identifier="4" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
<sel identifier="6" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
</art>
<datascad identifier="15">0</datascad>
<orig identifier="17">0</orig>
<sosp identifier="19">0</sosp>
</topic>
</root>
相反,我需要的结果如下:
<?xml version="1.0"?>
<root identifier="1">
<topic identifier="2" codice="02220020070748129" coobbligati="0" coobbligatiInfo="Unico Intestatario" status="0" statusWorkInProgress="0" imp1="22285" imp2="0" messaggio="" code="0">
<fDi identifier="3">-1</fDi>
<art identifier="4">
<comp identifier="5" message="" code="0" importo="22285" numero="14" flag="0" messageEcc="" codeEcc="0"/>
<def identifier="6" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
<sel identifier="7" message="" code="0" importo="0" numero="0" flag="0" messageEcc="" codeEcc="0"/>
</art>
<datascad identifier="8">0</datascad>
<orig identifier="9">0</orig>
<sosp identifier="10">0</sosp>
</topic>
</root>
提前感谢大家的贡献。
你的方法有两个问题:
您正在为 XML 文档中的每个 节点(元素、属性、文本)分配标识符);
position(
) 函数在当前上下文中起作用,而不是在整个 XML 文档中起作用。
我猜你想做:
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="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:attribute name="identifier">
<xsl:number count="*" level="any"/>
</xsl:attribute>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>