2014-09-03 80 views
0

早上好將這些以不同的順序,我有以下的(雙語)XML片段:運用順序編號作爲子節點的屬性值在一個父節點,然後在兄弟節點

<?xml version="1.0" encoding="UTF-8"?> 
<tmx version="1.4"> 
<body> 
    <tu> 
     <prop type="x-Context">-2050338055591740051, -2050338055591740051</prop> 
     <prop type="x-Origin">TM</prop> 
     <prop type="x-ConfirmationLevel">Translated</prop> 
     <tuv> 
      <seg> 
       <ele>The text </ele> 
       <ele> 
        <ph x="0" type="QIAsymphony"/> 
       </ele> 
       <ele> goes </ele> 
       <ele> 
        <ph x="0" type="470"/> 
       </ele> 
       <ele> here </ele> 
       <ele> 
        <ph x="0" type="471"/> 
       </ele> 
       <ele>.</ele> 
      </seg> 
     </tuv> 
     <tuv> 
      <seg> 
       <ele>El texto </ele> 
       <ele> 
        <ph x="0" type="QIAsymphony"/> 
       </ele> 
       <ele> se mete </ele> 
       <ele> 
        <ph x="0" type="471"/> 
       </ele> 
       <ele> aquí </ele> 
       <ele> 
        <ph x="0" type="470"/> 
       </ele> 
       <ele>.</ele> 
      </seg> 
     </tuv> 
    </tu> 
</body> 
</tmx> 

我首先想要將第一個tuv/seg節點中ph元素的x屬性值從1到3(在這種情況下)編號。

但是,我得到的結果是這樣的:

<tuv> 
      <seg> 
       <ele>The text </ele> 
       <ele> 
        <ph x="2" type="QIAsymphony"/> 
       </ele> 
       <ele> goes </ele> 
       <ele> 
        <ph x="4" type="470"/> 
       </ele> 
       <ele> here </ele> 
       <ele> 
        <ph x="6" type="471"/> 
       </ele> 
       <ele>.</ele> 
      </seg> 
     </tuv> 

這是基於以下XSLT樣式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 



<xsl:template match="tmx"> 
<tmx><xsl:attribute name="version"><xsl:value-of select="./@version"/></xsl:attribute> 
    <xsl:apply-templates/> 
</tmx> 
</xsl:template> 


<xsl:template match="body"> 
<body> 
    <xsl:apply-templates/> 
</body> 
</xsl:template> 

<xsl:template match="tuv"> 
<tuv> 
    <xsl:apply-templates/> 
</tuv> 
</xsl:template> 

<xsl:template match="prop"> 
<prop><xsl:attribute name="type"><xsl:value-of select="./@type"/></xsl:attribute> 
    <xsl:apply-templates/> 
</prop> 
</xsl:template> 


<xsl:template match="tu"> 
<tu> 
    <xsl:apply-templates/> 
</tu> 
</xsl:template> 

<xsl:template match="tuv[1]/seg"> 


<seg> 
<xsl:for-each select="ele"> 
<xsl:choose> 
<xsl:when test="child::ph"> 


<ele><ph><xsl:attribute name="x"> 

<xsl:number/> 
</xsl:attribute> 

<xsl:attribute name="type"> 

<xsl:value-of select="ph/@type"/> 
</xsl:attribute> 


</ph></ele> 
</xsl:when> 
</xsl:choose> 
<xsl:choose> 
<xsl:when test="child::text()"> 

<xsl:copy-of select="."/> 
</xsl:when> 
</xsl:choose> 

</xsl:for-each> 



</seg> 
</xsl:template> 


</xsl:stylesheet> 

爲了話,我需要以下結果:

<tuv> 
      <seg> 
       <ele>The text </ele> 
       <ele> 
        <ph x="1" type="QIAsymphony"/> 
       </ele> 
       <ele> goes </ele> 
       <ele> 
        <ph x="2" type="470"/> 
       </ele> 
       <ele> here </ele> 
       <ele> 
        <ph x="3" type="471"/> 
       </ele> 
       <ele>.</ele> 
      </seg> 
     </tuv> 

最後,根據第一個tuv/seg節點中的類型屬性值,我需要應用相應的荷蘭國際集團的x值與x在第二TUV/SEG節點(在這種情況下將是不同的順序)屬性:

<tuv> 
      <seg> 
       <ele>El texto </ele> 
       <ele> 
        <ph x="1" type="QIAsymphony"/> 
       </ele> 
       <ele> se mete </ele> 
       <ele> 
        <ph x="3" type="471"/> 
       </ele> 
       <ele> aquí </ele> 
       <ele> 
        <ph x="2" type="470"/> 
       </ele> 
       <ele>.</ele> 
      </seg> 
     </tuv> 

任何援助將不勝感激。

+0

爲什麼你再次問同樣的問題? http://stackoverflow.com/questions/25378898/numbering-placeholders-sequentally-in-a-node-based-on-sequence-in-which-they-ap – 2014-09-03 15:02:01

回答

0

要回答你的最直接的問題,你所得到的數字2,4的原因,6是因爲你如何使用xsl:number命令

<xsl:attribute name="x"> 
    <xsl:number/> 
</xsl:attribute> 

你在這一點上放置一個ele元素,所以會計算所有ele元素,當它看起來像你只想計算帶有子元素ph的元素時。因此,你需要做到這一點

<xsl:attribute name="x"> 
    <xsl:number count="ele[ph]"/> 
</xsl:attribute> 

然而,回答關於編號第二tuv元素你的下一個問題之前,你需要了解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="tuv[1]/seg/ele[ph]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <ph type="{ph/@type}"> 
       <xsl:attribute name="x"> 
        <xsl:number count="ele[ph]"/> 
       </xsl:attribute> 
      </ph> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

但要重新數第二tuv元素,可以考慮使用一個密鑰來查找ele元素在第一tuv元素

<xsl:key name="ph" match="tuv[1]/seg/ele/ph" use="@type" /> 

然後,做了編號,你將不得不指望前面的兄弟姐妹的數量爲每個元素

<xsl:attribute name="x"> 
     <xsl:value-of select="count(key('ph', ../@type)/../preceding-sibling::ele[ph]) + 1" /> 
    </xsl:attribute> 

這將在tuv元素中工作。

試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="ph" match="tuv[1]/seg/ele/ph" use="@type" /> 

    <xsl:strip-space elements="*" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="tuv/seg/ele/ph/@x"> 
     <xsl:attribute name="x"> 
      <xsl:value-of select="count(key('ph', ../@type)/../preceding-sibling::ele[ph]) + 1" /> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+0

偉大的,那工作的一種享受!:)我想進一步嘗試一下,並嘗試讓它在同一個XML文件上工作,然後減去ele元素,我自己添加這些元素使編號更易於執行。你認爲這可能實現嗎? – user3289842 2014-09-03 08:17:10

+0

是的,那應該是可以的!如果你不能解決問題,請隨時提出一個全新的問題! – 2014-09-03 08:33:03

相關問題