模板类似领域的XSLT
我的XML文件模板类似领域的XSLT
...
<element1>
<year>1</year>
<month>5</month>
<days>3</days>
</element1>
<element2>
<year>2</year>
<month>4</month>
<days>5</days>
</element2>
...
我的XSL-FO模板
<fo:block>
<xsl:value-of select="//element1/years"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="//element1/month"/>
<xsl:text> month </xsl:text>
<xsl:value-of select="//element1/days"/>
<xsl:text> days </xsl:text>
</fo:block>
...
<fo:block>
<xsl:value-of select="//element2/years"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="//element2/month"/>
<xsl:text> month </xsl:text>
<xsl:value-of select="//element2/days"/>
<xsl:text> days </xsl:text>
</fo:block>
正如你所看到的,这里是一个代码相似的块。 我如何简化这个表达式? 什么样的模板应该使用?
我写了一个模板,这样
<xsl:template match="element1">
<xsl:value-of select="years"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="month"/>
<xsl:text> month </xsl:text>
<xsl:value-of select="days"/>
<xsl:text> days </xsl:text>
</xsl:template>
,并用它
<fo:block>
<xsl:apply-templates select="element1"/>
</fo:block>
但它并不适用于element2中......
鉴于XML(学分去@ michael.hor257k):在模式
<parent>
<element1>
<year>1</year>
<month>5</month>
<days>3</days>
<hour>12</hour>
<minute>32</minute>
</element1>
<element2>
<year>2</year>
<month>4</month>
<days>5</days>
<hour>0</hour>
</element2>
</parent>
一匹配多个元素模板
<xsl:template match="element1 | element2">
<fo:block>
<xsl:value-of select="year"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="month"/>
<xsl:text> month </xsl:text>
<xsl:value-of select="days"/>
<xsl:text> days </xsl:text>
</fo:block>
</xsl:template>
II。呼叫Teamplate
<xsl:template match="element1">
<xsl:call-template name="renderOutput"/>
</xsl:template>
<xsl:template name="renderOutput">
<fo:block>
<xsl:value-of select="year"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="month"/>
<xsl:text> month </xsl:text>
<xsl:value-of select="days"/>
<xsl:text> days </xsl:text>
</fo:block>
</xsl:template>
[默认调用模板中的上下文节点拿起呼叫者的上下文节点!不需要,但也可以,继续<xsl:with-param name="this" select="."/>
和<xsl:value-of select="$this/year"/>
]
好吧,鉴于:
<parent>
<element1>
<year>1</year>
<month>5</month>
<days>3</days>
</element1>
<element2>
<year>2</year>
<month>4</month>
<days>5</days>
</element2>
</parent>
你可以这样做:
<xsl:template match="parent">
<fo:wrapper>
<xsl:for-each select="*">
<fo:block>
<xsl:value-of select="year"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="month"/>
<xsl:text> months </xsl:text>
<xsl:value-of select="days"/>
<xsl:text> days </xsl:text>
</fo:block>
</xsl:for-each>
</fo:wrapper>
</xsl:template>
获得:
<fo:wrapper>
<fo:block>1 years 5 months 3 days </fo:block>
<fo:block>2 years 4 months 5 days </fo:block>
</fo:wrapper>
我不需要选择所有的元素,我只是想这种 模板应用到具有类似孩子的元素,输精管地方
在这种情况下,您可以调用命名模板 - 例如:
<xsl:template match="element1">
<xsl:call-template name="duration"/>
</xsl:template>
...
<xsl:template match="element1">
<xsl:call-template name="duration"/>
</xsl:template>
...
<xsl:template name="duration">
<fo:block>
<xsl:value-of select="year"/>
<xsl:text> years </xsl:text>
<xsl:value-of select="month"/>
<xsl:text> months </xsl:text>
<xsl:value-of select="days"/>
<xsl:text> days </xsl:text>
</fo:block>
</xsl:template>
我不需要选择所有元素,我只是想将这种模板应用于具有类似子元素的元素,在不同的地方 – guesswho
@guesswho然后请发布一个更具代表性的示例。 –
不知道所有的细节,我会说,有两个元素“元素1”和“元素2”具有相同的结构气味的坏的XML设计,和我通常的政策设计糟糕的XML输入是将任务分成两部分:首先进行一次转换,清理XML并将其转换为设计良好的XML,然后再进行另一种转换,以完成真正的工作。 –