在XSL中保留树结构

时间:2012-07-17 12:56:45

标签: xml xslt xslt-1.0

我有以下文件:

<Doc>
    <If cond="c">
       <Expr>Expr1</Expr>
    </If>
    <Expr>Expr2</Expr>
</Doc>

哪个应该创建这样的输出:

If c { Expr1 } Expr2

但是,就我而言,它会创建:

Expr1 If c { Expr1 } Expr2

我有以下XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:template match="/">
       <xsl:element name="Doc">
            <xsl:apply-templates select="*" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="If">
      <xsl:text>if </xsl:text><xsl:value-of select="@cond"/><xsl:text> {</xsl:text>
      <xsl:apply-templates select="Expr"/><xsl:text>}</xsl:text>
    </xsl:template>

    <xsl:template match="Expr">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="*">
    </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="If">
     if <xsl:value-of select="@cond"/> <xsl:text/>
     <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="If/Expr">
  <xsl:value-of select="concat(' { ', ., ' }')"/>
 </xsl:template>

 <xsl:template match="Expr">
  <xsl:value-of select="concat(' ', .)"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<Doc>
    <If cond="c">
        <Expr>Expr1</Expr>
    </If>
    <Expr>Expr2</Expr>
</Doc>

生成想要的正确结果

 if c { Expr1 } Expr2

请注意

如果您简化转换只是为了这个:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="If">
          <xsl:text>if </xsl:text><xsl:value-of select="@cond"/><xsl:text> {</xsl:text>
          <xsl:apply-templates select="Expr"/><xsl:text>}</xsl:text>
        </xsl:template>

        <xsl:template match="Expr">
            <xsl:value-of select="."/>
        </xsl:template>
</xsl:stylesheet>

然后产生正确的结果

if c {Expr1}
Expr2

答案 1 :(得分:-1)

总是很难准确理解人们从样式表中要求的行为,但我认为你要问的是'我如何确保只有Expr元素下的If元素得到在括号内转换?'

尝试将template match="Expr"修改为template match="If/Expr" - 这会告诉转换引擎只有匹配的Ifrs下的Exprs才会匹配。