Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL1.0生成升序序列#_Xslt - Fatal编程技术网

Xslt XSL1.0生成升序序列#

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

我正在使用XSL1.0。我的编辑器/调试器是带有Saxon的OxygenXML(OxygenXML无法使用MSXML进行调试),它将部署到仅使用MSXML的第三方应用程序中。这意味着如果我想调试,就不能使用包含节点集的变量

问题可能表现为如何对以下各项的输出进行顺序编号:

<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的第三方应用程序。这意味着我不能使用变量 如果希望能够调试,则包含节点集

您仍然可以使用氧气和EXSLT
node-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