类似的XSLT转换不起作用



输入XML

<Web-inf>
<A>
<A1>Val1</A1>
<A1>Val1</A1>
<A1>Val1</A1>
</A>
<A>
<A1>Val2</A1>
<A1>Val2</A1>
<A1>Val2</A1>
</A>
<B>
<B1>Hi</B1>
</B>
<B>
<B1>Bye</B1>   
</B>
<C>DummyC</C>
<D>DummyD</D>
</Web-inf>

如果<B>标签还不存在,我想添加它,<B1>值为"Morning"one_answers"Evening"。如果它存在,我什么都不做。我写了下面的转换,但奇怪的问题是,只有后一个有效,而第一个完全被忽略了。结果,只有<B><B1>Evening</B1></B><B>标签一起被插入。这是一个已知的问题吗?如果是,如何更正?

<xsl:output method="xml" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Web-inf[not(B[B1='Morning'])]/B[last()]">
<xsl:copy-of select="*" />
<B>
<B1>Morning</B1>
</B>
</xsl:template>
<xsl:template match="Web-inf[not(B[B1='Evening'])]/B[last()]">
<xsl:copy-of select="*" />
<B>
<B1>Evening</B1>
</B>
</xsl:template>

我希望O/p XML如下

Output.xml

<Web-inf>
<A>
<A1>Val1</A1>
<A1>Val1</A1>
<A1>Val1</A1>
</A>
<A>
<A1>Val2</A1>
<A1>Val2</A1>
<A1>Val2</A1>
</A>
<B>
<B1>Hi</B1>
</B>
<B>
<B1>Bye</B1>   
</B>
<B>
<B1>Morning</B1>   
</B>
<B>
<B1>Evening</B1>   
</B>
<C>DummyC</C>
<D>DummyD</D>
</Web-inf>

对于给定的输入XML,B[last()]的两个模板都将匹配。当两个模板以相同的优先级匹配一个元素时,这被认为是一个错误。XSLT处理器将标记错误,或者忽略除最后一个匹配模板之外的所有模板。

在这种情况下,最好有一个与B[last()]匹配的模板,并在模板中有其他条件作为xsl:if语句。

尝试此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Web-inf/B[last()]">
<xsl:copy-of select="*" />
<xsl:if test="not(../B[B1='Morning'])">
<B>
<B1>Morning</B1>
</B>
</xsl:if>
<xsl:if test="not(../B[B1='Evening'])">
<B>
<B1>Evening</B1>
</B>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新