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 阿尔托瓦';s和灶台';结果不一样_Xslt - Fatal编程技术网

Xslt 阿尔托瓦';s和灶台';结果不一样

Xslt 阿尔托瓦';s和灶台';结果不一样,xslt,Xslt,我有此表中的查找表,如果buyeritemcode=substring(字段[@id='0'],11,3),则取查找表中的subfamily=subfamily,否则取“9”: <lookup> <Code> <BuyerItemCode>439</BuyerItemCode> <Subfamily>016</Subfamily> </Code>

我有此表中的查找表,如果buyeritemcode=substring(字段[@id='0'],11,3),则取查找表中的subfamily=subfamily,否则取“9”:

<lookup>
    <Code>
        <BuyerItemCode>439</BuyerItemCode>
        <Subfamily>016</Subfamily>          
    </Code>
</lookup>   


439
016

Xml文件看起来:

<document>
    <line id="14">
        <field id="0"><![CDATA[MMM4443 419280600000]]></field>
    </line>
    <line id="15">
        <field id="0"><![CDATA[MMM4443 414390600000]]></field>
    </line>
</document>

我需要将这个数据与lookup.xml进行比较,如果数据没有比较,则插入常量9。使用altova v11,我的程序可以运行,而使用cooktop则不行,我的意思是比较是错误的。 我的程序看起来:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="date exsl">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:key name="ProdSubfamily" match="Subfamily" use="../BuyerItemCode"/>
    <xsl:template match="/">
        <Interchange>
            <Group>
                <Message>
                    <xsl:if test="/document/line[(substring(field[@id='0'], 1,3)='MMM')]">
                        <xsl:apply-templates mode="MMM" select="/document"/>
                    </xsl:if>
                </Message>
            </Group>
        </Interchange>
    </xsl:template>
    <xsl:template mode="MMM" match="/document">
        <PriceCatalogue-Lines>
            <xsl:for-each select="/document/line[contains(substring(field[@id='0'], 1,3),'MMM') and not(contains(substring(field[@id='0'],9,1),'0'))]">
                <xsl:variable name="inputProd" select="substring(field[@id='0'], 11,3)"/>
                <Line>
                    <Line-Item>
                        <LineNumber>
                            <xsl:value-of select="position()"/>
                        </LineNumber>
                        <BuyerItemCode>
                            <xsl:value-of select="substring(field[@id='0'], 11,3)"/>
                        </BuyerItemCode>
                        <SubFamily>
                            <xsl:choose>
                                <xsl:when test="substring(field[@id='0'], 11,3) = document('lookup.xml')/*/*/BuyerItemCode">
                                    <xsl:for-each select="document('lookup.xml')">
                                        <xsl:for-each select="key('ProdSubfamily',$inputProd)">
                                            <xsl:value-of select="."/>
                                        </xsl:for-each>
                                    </xsl:for-each>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="'9'"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </SubFamily>
                    </Line-Item>
                </Line>
            </xsl:for-each>
        </PriceCatalogue-Lines>
    </xsl:template>
</xsl:stylesheet>

使用Altova获得的正确结果,我希望使用cooktop获得此结果:

<Interchange>
    <Group>
        <Message>
            <PriceCatalogue-Lines>
                <Line>
                    <Line-Item>
                        <LineNumber>1</LineNumber>
                        <BuyerItemCode>928</BuyerItemCode>
                        <SubFamily>9</SubFamily>
                    </Line-Item>
                </Line>
                <Line>
                    <Line-Item>
                        <LineNumber>2</LineNumber>
                        <BuyerItemCode>439</BuyerItemCode>
                        <SubFamily>016</SubFamily>
                    </Line-Item>
                </Line>
            </PriceCatalogue-Lines>
        </Message>
    </Group>
</Interchange>

1.
928
9
2.
439
016
我使用Cooktop的结果很糟糕:

<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>

1.
928
9
2.
439
9

问题出在源XML文档中

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>
CDATA部分包含一个不必要的
[
字符,它是文本节点的第一个字符。这意味着:

substring(field[@id='0'], 1,3)='MMM'
总是
false()

解决方案

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>
更换

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

同时替换

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

<field id="0"><![CDATA[MMM4443 414390600000]]></field>

现在,不管使用的XSLT处理器是什么(我家里有9个XSLT处理器,可以在其中8个上运行:MSXML3/4、.NET XslCompiledTransform和XslTransform、AltovaXML、Saxon 6.5.4、Saxon 9.1.05和XQSharp),转换的结果都是您想要的

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

1.
928
9
2.
439
016

我猜Cooktop的XSLT处理器需要一些配置才能执行
document()
函数
——研究可用的文档如何执行此操作。

问题出在源XML文档中

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>
CDATA部分包含一个不必要的
[
字符,它是文本节点的第一个字符。这意味着:

substring(field[@id='0'], 1,3)='MMM'
总是
false()

解决方案

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>
更换

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

同时替换

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

<field id="0"><![CDATA[MMM4443 414390600000]]></field>

现在,不管使用的XSLT处理器是什么(我家里有9个XSLT处理器,可以在其中8个上运行:MSXML3/4、.NET XslCompiledTransform和XslTransform、AltovaXML、Saxon 6.5.4、Saxon 9.1.05和XQSharp),转换的结果都是您想要的

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

1.
928
9
2.
439
016

我猜Cooktop的XSLT处理器需要一些配置才能执行
document()
函数
——研究可用的文档如何执行此操作。

Petras,您看到的输出可能意味着XSLT处理器无法找到lookup.xml文件

由于您使用的是相对URL('lookup.xml'),您知道基本URL是什么吗?换句话说,相对于什么

默认情况下,我相信使用的基本URL是样式表的URL。如果将第二个参数传递给document(),则可以显式设置基本URL。例如:

document('lookup.xml', /)
将查找相对于输入xml文件的“lookup.xml”

你可以通过提供一个指向“lookup.xml”的绝对URL来解决这个问题,或者至少找出问题所在。你为什么不试试,让我们知道它是否有效

document('/home/lars/lookup.xml')


p.S.XML Cooktop一直是一款很棒的软件,但它似乎很旧,现在显然没有维护。当出现故障时,这会成为一个问题。您可能希望尝试其他XSLT工具,如OxygenXML或StylusStudio,这些工具仍在维护中。

Petras,您看到的输出可能意味着XSLT处理器无法运行查找lookup.xml文件

由于您使用的是相对URL('lookup.xml'),您知道基本URL是什么吗?换句话说,相对于什么

默认情况下,我相信使用的基本URL是样式表的URL。如果将第二个参数传递给document(),则可以显式设置基本URL。例如:

document('lookup.xml', /)
将查找相对于输入xml文件的“lookup.xml”

您可以通过提供一个指向“lookup.xml”的绝对URL来修复这个问题,或者至少找出问题是否出在哪里