2016-11-11 79 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然後請發佈一個更具代表性的示例。 –