我有两个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() < $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;。
有人可以帮我识别问题。
提前致谢。
答案 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
)。