2016-03-11 107 views
0

我需要僅使用xslt 1.0壓縮XML文檔中缺失的數據,重新排序它以使項目的索引比任何索引大1後索引缺失。 (很難連貫解釋,我承認)。重新編號,使用xslt 1.0重新排序XML數據

我試過某些算法,但是當然沒有一個會根據輸出發生變化而工作,並且不會反覆地持續運行腳本,直到輸出不再發生變化。一個簡化的示例:

輸入:

<Set Id="gump"> 
    <!-- Missing 2,3, must renumber 4->2 and 5->3 --> 
    <parameter fieldId="primary.1.label" value="Was 1"/> 
    <parameter fieldId="primary.4.label" value="Was 4"/> 
    <parameter fieldId="primary.4.tag" value="Was 4"/> 
    <parameter fieldId="primary.5.label" value="Was 5"/> 
    <parameter fieldId="primary.5.somefld" value="Was 5"/> 
</Set> 

嵌入在fieldId屬性的索引必須是順序輸出,1,2,3;不是1,4,5,例如, - 「primary.4.label」必須是輸出中的「primary.2.label」等。

在輸入樣本中沒有索引爲2或3的項目。這是必須後續項目的索引大於缺失索引。因此所有指數4都變成指數2,所有指數5變成指數3。

索引集之間的子字段(「標籤」,「標籤」,「somefld」)可能不同。有些可能出現在一組中,而另一組缺席。

輸出:

<Set Id="gump"> 
    <!-- Desired output --> 
    <parameter fieldId="primary.1.label" value="Was 1"/> 
    <parameter fieldId="primary.2.label" value="Was 4"/> 
    <parameter fieldId="primary.2.tag" value="Was 4"/> 
    <parameter fieldId="primary.3.label" value="Was 5"/> 
    <parameter fieldId="primary.3.somefld" value="Was 5"/> 
</Set> 

我寧願一個新手到XSLT,所以我用鑰匙掙扎着,等

+0

您的問題沒有明確定義。目前尚不清楚給出的是什麼,僅僅是一個例子。通常,您可以使用'position()'函數或'xsl:number'元素來編號節點 –

回答

0

---編輯---

顯然,這是一個分組問題 - 在XSLT 1.0中最好使用Muenchian方法解決。

假設更換的數量總是第一個和給定的字符串中的第二期之間,你可以應用以下樣式:

XSLT 1.0

<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:key name="param-by-id" match="parameter" use="substring-before(substring-after(@fieldId, '.'), '.')" /> 

<xsl:template match="Set"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="parameter[count(. | key('param-by-id', substring-before(substring-after(@fieldId, '.'), '.'))[1]) = 1]"> 
      <xsl:variable name="i" select="position()" /> 
      <xsl:for-each select="key('param-by-id', substring-before(substring-after(@fieldId, '.'), '.'))"> 
       <parameter> 
        <xsl:copy-of select="@*"/> 
        <xsl:attribute name="fieldId"> 
         <xsl:value-of select="substring-before(@fieldId, '.')"/> 
         <xsl:text>.</xsl:text> 
         <xsl:value-of select="$i"/> 
         <xsl:text>.</xsl:text> 
         <xsl:value-of select="substring-after(substring-after(@fieldId, '.'), '.')"/> 
        </xsl:attribute> 
       </parameter> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

您輸入收到:

<?xml version="1.0" encoding="UTF-8"?> 
<Set Id="gump"> 
    <parameter fieldId="primary.1.label" value="Was 1"/> 
    <parameter fieldId="primary.2.label" value="Was 4"/> 
    <parameter fieldId="primary.2.tag" value="Was 4"/> 
    <parameter fieldId="primary.3.label" value="Was 5"/> 
    <parameter fieldId="primary.3.somefld" value="Was 5"/> 
</Set> 
+0

哇。一個快速而優雅的解決方案,恐怕我沒有描述得很好,也沒有我需要的。您會看到每個參數都屬於一組,由。#組成。我選擇「索引」這個詞可能不準確。我喜歡 - 我也必須研究。 – jkwhitman

+0

謝謝。恐怕這不符合法案。輸出需要如上所示。每個「集合」中經常有多個元素。需要具有相同的索引(數字),例如 - 1,2,2,3,3;不是1,2,3,4,5。 – jkwhitman

+0

@jkwhitman我明白了。請確認數字始終在'primary.'之後,並在下一個'.'之前。或者至少在前兩個時期之間。 –