首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT2.0双程进程不像预期的那样工作

XSLT2.0双程进程不像预期的那样工作
EN

Stack Overflow用户
提问于 2014-05-03 12:57:50
回答 1查看 243关注 0票数 0

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

代码语言:javascript
复制
<?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>

预期产出:

代码语言:javascript
复制
 Box1                     Box1 Fldr1       Box1 Fldr2

 Box1 Fldr3              Box2              Box2 Fldr1

 Box2 Fldr2              Box2 Fldr3        Box2 Fldr4

这是我的xsl

代码语言:javascript
复制
<?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,并将结果存储在变量"$phase-1- result“中,并在第二次传递中使用新的结构进行格式化。

问题是xml间谍没有识别变量。它将其显示为未定义的变量和错误:意外标记"$phase-1-result/ListofLabels/Label“。

有人能帮我找出这个问题吗。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-03 14:35:00

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

代码语言:javascript
复制
<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>

在这里,我在应用phase-2模板时执行“选择每三个标签”的逻辑,因此该模板只需要关注“我和我的下两个兄弟姐妹”。

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

代码语言:javascript
复制
<xsl:variable name="someNodes" select="/foo/bar | /foo/ping" />
<xsl:apply-templates select="$someNodes" />

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23444738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档