2015-09-07 15 views
2

卡住了,需要諮詢。恐怕不是XSLT的專家。<xsl:apply templates>如何應用多個模板/翻譯

我有這個示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<a> 
    <b key="x"/> 
    <b key="y"> text></b>   
    <b key="z"><p>This contains HTML Code.<br/><br/>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <br/><br/>At vero eos et accusam et justo duo dolores et ea rebum. <br/>///<br/>///Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.///<br/> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <br/>At vero eos et accusam et justo duo dolores et ea rebum. <br/>Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p></b> 
</a> 

我需要輸出的"/a[1]/b[@key='z']"內容,改造所有<p></p> - 和所有<br/> -blocks到UNIX換行符&#xa;/&#10;。同時確保輸出代碼沒有/|\&0x9;(水平標籤)類型的字符。

全部/|\字符應被連字符-取代,並且所有水平製表符應完全刪除。

這是我目前的XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

    <xsl:template match="/"> 
     <xsl:variable name="foo" select="/a[1]/b[@key='z']" /> 
     <xsl:apply-templates select="$foo" /> 
    </xsl:template> 

    <xsl:template match="/a[1]/b[@key='z']"> 
     <xsl:value-of select="translate(.,'/\|&#x9;', '---')"/> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="br"> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

我得到確實有兩個結果,一個與替換和一個與換行插入輸出:

<?xml version="1.0" encoding="UTF-8"?>This contains HTML Code.Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. ------Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.--- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
This contains HTML Code. 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 

At vero eos et accusam et justo duo dolores et ea rebum. 
/// 
///Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet./// 
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
At vero eos et accusam et justo duo dolores et ea rebum. 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 

請,怎麼樣我可以插入換行符替換不需要的字符嗎?

回答

1

您可以通過處理文本節點並明確地匹配它們來解決這個問題。由於您只需要翻譯文本節點一次,這是您的需求的工作解決方案。

使用下面的代碼我也簡化了您的匹配模板b,因爲從根節點您已經做出選擇,並且沒有其他地方應用不正確的b節點。

而且我添加了匹配p,它需要處理它的孩子(見代碼)。您可能希望將其分割出來,因爲您可能需要使用p換行符。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

    <xsl:template match="/"> 
     <xsl:variable name="foo" select="/a[1]/b[@key='z']" /> 
     <xsl:apply-templates select="$foo" /> 
    </xsl:template> 

    <!-- this currently does nothing and can be removed, 
     unless in your code something more is done here --> 
    <xsl:template match="b"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="br | p"> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="text()"> 
     <xsl:value-of select="translate(.,'/\|&#x9;', '---')"/> 
    </xsl:template> 

</xsl:stylesheet> 

這給:

This contains HTML Code. 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 

At vero eos et accusam et justo duo dolores et ea rebum. 
--- 
---Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.--- 
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
At vero eos et accusam et justo duo dolores et ea rebum. 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
+0

這就是它!非常感謝Abel打開我的大腦結:-) –

+0

是的,如上所述,'/ | \'字符將被連字符/破折號所替代,並且製表位將被完全刪除,因此缺少的第四個短劃線是故意的。 –

+0

@OliverSträssle,啊,現在明白了,是的,你這麼說。對不起,關於[投票請求](http://stackoverflow.com/help/whats-reputation),我忘了你[需要15個代表](http://stackoverflow.com/help/privileges/vote-up) ,當你的問題或答案被投票後你會得到。 – Abel

1

試試這樣說?

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:template match="/a"> 
    <xsl:apply-templates select="b[@key='z']"/> 
</xsl:template> 

<xsl:template match="br"> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:value-of select="translate(., '/|\&#x9;', '----')"/> 
</xsl:template> 

</xsl:stylesheet> 

結果,當施加到你的例子,將是:

This contains HTML Code. 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 

At vero eos et accusam et justo duo dolores et ea rebum. 
--- 
---Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.--- 
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
At vero eos et accusam et justo duo dolores et ea rebum. 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 

:XML文檔只能有一個根元素,所以謂詞/a[1]是多餘的。只有一次使用的'$ foo'變量也是如此。

+0

看起來很棒,'a [1]'和刪除'b'的刪除模板。簡單。你也發現了翻譯函數錯誤;)。 +1。 – Abel