1

我有以下文件:

<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>
4

2 回答 2

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
于 2012-07-17T13:17:43.130 回答
-1

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

尝试修改template match="Expr"template match="If/Expr"- 这告诉转换引擎只有在 Ifs 下的 Exprs 应该匹配。

于 2012-07-17T13:05:39.200 回答