如何使用xsl来区分两个相似的标签(变量)

时间:2011-04-26 19:37:17

标签: xml xslt

我需要创建一个能够读取两个xml文件的xsl,除了第一个标记之外,它们具有相同的结构:

入站xml:

<beans:beans> <fix-inbound> <message></message> </fix-inbound> </beans:beans>

出站xml:

<beans:beans> <fix-outbound> <message></message> </fix-outbound> </beans:beans>

我能找到的解决方案是:

  • 创建两个文件以读取入站和出站
  • 非常糟糕,如果:

    <xsl:if test="fix-inbound">
        code to read the content
    </xsl:if>
    <xsl:if test="fix-outbound"> 
        same piece of code to read the content 
    </xsl:if>
    
  • 在我的<xsl:for-each select="$valueOfMyFirstTag">中使用变量,该变量的值可以是 fix-inbound fix-outbound

    < / LI>

但是,我不知道如何获取第一个标签的值。这可能使用xsl吗?

有没有更优雅的方法来解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用

<xsl:for-each select="/*/fix-inbound | /*/fix-outbound">

(或根据您的使用情况,使用apply-templates代替for-each)。

答案 1 :(得分:1)

一点也不清楚你要做什么或者你失败的地方,但是从你的帖子中可以看出你还没有发现模板规则的乐趣,它构成了真正的XSLT处理的核心。也许你还没有在路径中发现通配符(*)或“//”伪运算符的强大功能。

答案 2 :(得分:1)

使用

<xsl:template match="/">
 <xsl:apply-templates select="/*/*[1]"/>
</xsl:template>

<xsl:template match="fix-inbound">
 <!-- Perform whatever processing is necessary  -->
</xsl:template>

<xsl:template match="fix-outbound">
 <!-- Perform whatever processing is necessary  -->
</xsl:template>

<强>解释

<xsl:apply-templates select="/*/*[1]"/>指令会导致最佳匹配顶级元素的第一个子元素的模板被选择执行和应用。

如果文档属于第一种类型,则会应用匹配fix-inbound的模板。

如果文档属于第二种类型,则会应用匹配fix-outbound的模板。

请注意:此解决方案中根本不使用条件指令 - 在XSLT中,它们很少是必需的,如果存在条件指令,则表明某些重构可能是合适的。 / p>