Xslt XSL1.0生成升序序列#
我正在使用XSL1.0。我的编辑器/调试器是带有Saxon的OxygenXML(OxygenXML无法使用MSXML进行调试),它将部署到仅使用MSXML的第三方应用程序中。这意味着如果我想调试,就不能使用包含节点集的变量 问题可能表现为如何对以下各项的输出进行顺序编号:Xslt XSL1.0生成升序序列#,xslt,Xslt,我正在使用XSL1.0。我的编辑器/调试器是带有Saxon的OxygenXML(OxygenXML无法使用MSXML进行调试),它将部署到仅使用MSXML的第三方应用程序中。这意味着如果我想调试,就不能使用包含节点集的变量 问题可能表现为如何对以下各项的输出进行顺序编号: <xsl:for-each select="node1"> <xsl:variable name="current_ID" select="ID"> <xsl:for-each s
<xsl:for-each select="node1">
<xsl:variable name="current_ID" select="ID">
<xsl:for-each select="sub_node1">
<xsl:value-of select="../ID"/>-<xsl:value-of select="Sub_ID"/>
</xsl:for-each>
</xsl:for-each>
-
理解我不能在我的场景中简单地使用它:
<xsl:for-each select="node1/sub_node1">
<xsl:value-of select="position()"/>
</xsl:for-each>
下面是一个人工制作的示例,它显示了我作为更大的XSL/XML组合的一部分试图解决的问题。我基本上需要创建制造说明。XML中除产品/版本(按数量)外的所有节点的顺序都正确,我无法更改它。我需要从3个不同的XSL生成相同的序列号集。我当前的上下文始终是发货/交付/交付产品(即我的XSL必须处理所示序列中的节点)。我需要产生一个产品清单,按版本数量和他们的交货排序。在下面的示例中,每行都应该有一个序号(1-4)
<shipments>
<product>
<name>Product 1</name>
<prod_id>P1</prod_id>
<version>
<version_id>P1_V1</version_id>
<qty>8800</qty>
</version>
<version>
<version_id>P1_V2</version_id>
<qty>1100</qty>
</version>
<version>
<version_id>P1_V3</version_id>
<qty>100</qty>
</version>
</product>
<product>
<name>Product 2</name>
<prod_id>P2</prod_id>
<version>
<version_id>P2_V1</version_id>
<qty>5000</qty>
</version>
<version>
<version_id>P2_V2</version_id>
<qty>5000</qty>
</version>
<version>
<version_id>P2_V3</version_id>
<qty>2000</qty>
</version>
</product>
<deliveries>
<del_id>1</del_id>
<destination>Miami</destination>
<delivery_products>
<version_id>P1_V1</version_id>
<qty>8000</qty>
</delivery_products>
<delivery_products>
<version_id>P2_V1</version_id>
<qty>5000</qty>
</delivery_products>
</deliveries>
<deliveries>
<del_id>2</del_id>
<destination>New York</destination>
<delivery_products>
<version_id>P1_V1</version_id>
<qty>800</qty>
</delivery_products>
<delivery_products>
<version_id>P2_V2</version_id>
<qty>1000</qty>
</delivery_products>
</deliveries>
产品1
P1
P1_V1
8800
P1_V2
1100
P1_V3
100
产品2
P2
P2_V1
5000
P2_V2
5000
P2_V3
2000
1.
迈阿密
P1_V1
8000
P2_V1
5000
2.
纽约
P1_V1
800
P2_V2
1000
预期产出如下。注:序号#从1开始,最多4次
<table>
<thead>
<tr>
<td class="col_head">
Seq
</td>
<td class="col_head">
Version
</td>
<td class="col_head">
Destination
</td>
<td class="col_head">
Qty
</td>
</tr>
</thead>
<tr>
<td colspan="4" class="rev_heading">Product 1</td>
</tr>
<tr>
<td>1</td>
<td>P1_V1</td>
<td>Miami</td>
<td>8000</td>
</tr>
<tr>
<td>2</td>
<td>P1_V1</td>
<td>New York</td>
<td>800</td>
</tr>
<tr>
<td colspan="4" class="rev_heading">Product 2</td>
</tr>
<tr>
<td>3</td>
<td>P2_V1</td>
<td>Miami</td>
<td>5000</td>
</tr>
<tr>
<td>4</td>
<td>P2_V2</td>
<td>New York</td>
<td>5000</td>
</tr>
</table>
序号
版本
目的地
数量
产品1
1.
P1_V1
迈阿密
8000
2.
P1_V1
纽约
800
产品2
3.
P2_V1
迈阿密
5000
4.
P2_V2
纽约
5000
这是我到目前为止的XSL(只是为seq#插入了一个位置())
序列检验
表{边框:1px纯黑色;边框折叠:折叠;}
td{边框:1px纯黑色;填充:1px 5px 1px 5px;}
.col_head{font-weight:600;}
.rev_标题{颜色:红色;文本对齐:居中;顶部填充:15px;}
序号
版本
目的地
数量
我正在使用XSL1.0。我的编辑器/调试器是带有Saxon的OxygenXML
(OxygenXML无法使用MSXML进行调试),它将被部署为使用
仅使用MSXML的第三方应用程序。这意味着我不能使用变量
如果希望能够调试,则包含节点集
您仍然可以使用氧气和EXSLTnode-set()
完成后,只需从更改名称空间uri即可http://exslt.org/common“
至“urn:schemas microsoft com:xslt”
这里是此技术的一个简短示例。假设已完成以下转换的调试:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:variable name="vrtfPass1">
<xsl:apply-templates select="num[. mod 3 = 0]"/>
</xsl:variable>
<xsl:copy-of select="sum(ext:node-set($vrtfPass1)/*)"/>
</xsl:template>
<xsl:template match="num">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
谢谢你,迪米特里。你能解释一下这句话吗Regards@mark1234,对select
属性中的表达式求值,然后将求值结果复制到输出中(因为我们希望查看并验证它是否正确)。至于:sum(ext:node set($vrtfPass1)/*)
——内部子表达式将$vrtfPass1
的RTF(结果树片段)值转换为普通树,我们可以使用XPath进行检查。臭名昭著的RTF类型禁止对其进行任何有用的XPath计算(除非使用其字符串值,否则无法访问任何内部节点)。所有XSLT 1.0处理器都有xxx:node-set()扩展,可以将其转换为一个常规的访问树。感谢Dimitri,它工作得很好。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:variable name="vrtfPass1">
<xsl:apply-templates select="num[. mod 3 = 0]"/>
</xsl:variable>
<xsl:copy-of select="sum(ext:node-set($vrtfPass1)/*)"/>
</xsl:template>
<xsl:template match="num">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="urn:schemas-microsoft-com:xslt">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:variable name="vrtfPass1">
<xsl:apply-templates select="num[. mod 3 = 0]"/>
</xsl:variable>
<xsl:copy-of select="sum(ext:node-set($vrtfPass1)/*)"/>
</xsl:template>
<xsl:template match="num">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
18