【发布时间】:2014-12-09 18:16:08
【问题描述】:
据我所知,XSL 的工作原理如下:它选择一些节点进行处理,然后应用于此选择中的每个节点。
我很困惑,因为看起来在这里我们有两次相同的 SOMETHING 选择:首先在应用模板中,然后在模板匹配中。请考虑我下面的例子。我得到了我想要的:仅当文本属性不为空时,才用 Pmatch 标签替换项目中的标签。但是如你所见,我已经两次指定了这个条件!这是正常的方式吗?
XML
<?xml version="1.0" encoding="UTF-8"?>
<Manager text="this is a manager">
<Name text="true name">Ivan</Name>
<Projects text="ps">
<Project text="ba">Bank</Project>
<Project text="ca">Cars</Project>
<Project>Business</Project>
</Projects>
</Manager>
XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:foo="myFoo" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/Manager">
<ThisIsWhatIWantToSeeInName>
<xsl:apply-templates/>
</ThisIsWhatIWantToSeeInName>
</xsl:template>
<xsl:template match="Name">
<NewName>Rihanna</NewName>
</xsl:template>
<xsl:template match="Projects">
<Jobs>Jo-Jobs</Jobs>
<NewJobs>
<xsl:apply-templates select="Project[@text != '']"/>
</NewJobs>
</xsl:template>
<xsl:template match="Project[@text != '']">
<PMatch><xsl:value-of select="@text"/></PMatch>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<ThisIsWhatIWantToSeeInName xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:foo="myFoo" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<NewName>Rihanna</NewName>
<Jobs>Jo-Jobs</Jobs>
<NewJobs>
<PMatch>ba</PMatch>
<PMatch>ca</PMatch>
</NewJobs>
</ThisIsWhatIWantToSeeInName>
为了逃避双重选择规范,我尝试了以下方法:
1) 我尝试通过选择所有 Proejct 来扩大应用模板的选择范围。 但是,当模板仅找到那些具有文本属性的模板时 - 其他模板会发送到默认模板,这会在我的 XML 中产生一些纯文本。我能以某种方式影响这种行为吗?我可以关闭默认模板吗?
2) 我尽量限制应用模板的选择。好的,但是如果我现在让模板匹配更广泛,比如 match='/'(因为在 apply-templates 中选择了所有正确的节点) - 我的模板将在这部分代码之前匹配许多元素,它甚至会匹配根节点。可能是,我可以以某种方式将我的模板“连接”到应用它的地方?我想确保我的模板只在我想要的地方被调用。
【问题讨论】: