XSLT 2.0两次传递过程没有按预期工作

时间:2014-05-03 12:57:51

标签: variables xslt xslt-2.0

我有两个xslt转换应用于xml消息。

<?xml version="1.0" encoding="UTF-8"?>    
    <ListOfBipBoxfldrlbls>
      <Batch>   
        <ListOfFolder>
          <Folder>
            <FolderNum>Fldr1</FolderNum>             
            <BoxNumber>Box1</BoxNumber>
            <BatchNumber>Batch</BatchNumber>
          </Folder>
          <Folder>
            <FolderNum>Fldr2</FolderNum>       
            <BoxNumber>Box1</BoxNumber>  
            <BatchNumber>Batch</BatchNumber>        
          </Folder>
          <Folder>
            <FolderNum>Fldr3</FolderNum>        
            <BoxNumber>Box1</BoxNumber> 
            <BatchNumber>Batch</BatchNumber>
          </Folder>
          <Folder>
            <FolderNum>Fldr1</FolderNum>
            <BoxNumber>Box2</BoxNumber>
            <BatchNumber>Batch</BatchNumber>
          </Folder>
          <Folder>
            <FolderNum>Fldr2</FolderNum>
            <BoxNumber>Box2</BoxNumber>
            <BatchNumber>Batch</BatchNumber>
          </Folder>
          <Folder>
            <FolderNum>Fldr3</FolderNum>
            <BoxNumber>Box2</BoxNumber>
            <BatchNumber>Batch</BatchNumber>
          </Folder>
          <Folder>
            <FolderNum>Fldr4</FolderNum>
            <BoxNumber>Box2</BoxNumber>
            <BatchNumber>Batch</BatchNumber>
          </Folder>
          </ListOfFolder>
        <ListOfBox>
          <Box>
            <BatchNumber>Batch</BatchNumber>
            <BoxNumber>Box1</BoxNumber>               
          </Box>
          <Box>     
            <BatchNumber>Batch</BatchNumber>
            <BoxNumber>Box2</BoxNumber>                
          </Box>
        </ListOfBox>
      </Batch>  
    </ListOfBipBoxfldrlbls>

预期产出:

 Box1                     Box1 Fldr1       Box1 Fldr2

 Box1 Fldr3              Box2              Box2 Fldr1

 Box2 Fldr2              Box2 Fldr3        Box2 Fldr4

这是我的xsl

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
    <xsl:variable name="phase-1-result">
        <xsl:apply-templates select="/" mode="phase-1"/>
    </xsl:variable>
    <xsl:apply-templates select="$phase-1-result" mode="phase-2"/>
</xsl:template>

<xsl:template match="/" mode="phase-1">
  <ListofLabels>
    <xsl:for-each select="ListOfBipBoxfldrlbls/Batch/ListOfFolder/Folder">
      <Label>        
        <FolderNum><xsl:value-of select="FolderNum"/></FolderNum>
        <Box><xsl:value-of select="BoxNumber"/></Box>
        <Batch><xsl:value-of select="BatchNumber"/></Batch>
      </Label>
    </xsl:for-each>
    <xsl:for-each select="ListOfBipBoxfldrlbls/Batch/ListOfBox/Box">
      <Label>        
        <Box><xsl:value-of select="BoxNumber"/></Box>
        <Batch><xsl:value-of select="BatchNumber"/></Batch>
      </Label>
    </xsl:for-each>
  </ListofLabels>
</xsl:template>

<xsl:template match="$phase-1-result/ListofLabels/Label" mode="phase-2">    
    <xsl:variable name="columns" select="3" />
    <TABLE border="1">
      <xsl:for-each select="$phase-1-result/ListofLabels/Label[position() mod $columns = 1]"> 
         <TR>
           <xsl:for-each select=".|following-sibling::$phase-1-result/ListofLabels/Label[position() &lt; $columns]">
             <TD>
               <xsl:value-of select="." />
             </TD>
           </xsl:for-each> 
         </TR> 
      </xsl:for-each> 
    </TABLE> 
    </xsl:template>

</xsl:stylesheet>

我正在尝试在第一遍中重构XML并将结果存储在变量&#34; $ phase-1-result&#34;并使用新结构在第二遍中格式化。

问题是xmlspy无法识别变量。它显示为未定义的变量和错误:意外的令牌&#34; $ phase-1-result / ListofLabels / Label&#34;。

有人可以帮我识别问题。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您只需要在初始<xsl:apply-templates select="$phase-1-result" mode="phase-2" />中使用该变量。在那之后你就会在里面&#34;阶段1结果树,匹配表达式和进一步选择不需要使用变量,它们只是在这个新的上下文中工作:

<xsl:template match="/">
  <xsl:variable name="phase-1-result">
    <xsl:apply-templates select="/" mode="phase-1"/>
  </xsl:variable>

  <TABLE border="1">
    <xsl:apply-templates  mode="phase-2"
      select="($phase-1-result/ListOfLabels/Label)[position() mod 3 = 1]"/>
  </TABLE>
</xsl:template>

<!-- phase-1 template as before -->

<xsl:template match="Label" mode="phase-2">
  <TR>
    <xsl:apply-templates select=".|following-sibling::Label[position() lt 3]"
                         mode="columns" />
  </TR>
</xsl:template>

<xsl:template match="Label" mode="columns">
  <TD>
    <xsl:value-of select="." />
  </TD>
</xsl:template>

我在这里&#34;选择每隔三个标签&#34;在应用phase-2模板时的逻辑,因此模板只需要关注&#34;我和我的下两个兄弟姐妹&#34;位。

与声明包含原始输入树中的节点的变量然后将模板应用于那些

没有什么不同
<xsl:variable name="someNodes" select="/foo/bar | /foo/ping" />
<xsl:apply-templates select="$someNodes" />

<xsl:template match="bar">...</xsl:template>

模板匹配表达式并不关心节点的来源,它们只关心节点的外观(是bar还是ping)。