2016-11-11 32 views
0

我的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中......

+0

不知道所有的细节,我会说,有两个元素“元素1”和“元素2”具有相同的结构气味的坏的XML设计,和我通常的政策设计糟糕的XML输入是将任务分成两部分:首先进行一次转换,清理XML并将其转换为设计良好的XML,然后再进行另一种转换,以完成真正的工作。 –

回答

1

鉴于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"/>]

1

好吧,鉴于:

<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> 
+0

我不需要选择所有元素,我只是想将这种模板应用于具有类似子元素的元素,在不同的地方 – guesswho

+0

@guesswho然后请发布一个更具代表性的示例。 –