我有以下文件:
<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>
答案 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才会匹配。