我有一個任務,我需要遍歷 XML 檔案并合并具有相同 ID 的元素/節點。輸出應該是一個 csv 檔案(用于進一步處理),其中每一行都有固定的長度。根據節點的值,該值需要放置在輸出中的某個位置。
這是XML的示例:
<root>
<User>
<UserID>55555</UserID>
<Value>Active</Value>
</User>
<User>
<UserID>55555</UserID>
<Value>Admin</Value>
</User>
<User>
<UserID>55555</UserID>
<Value>Eligible</Value>
</User>
<User>
<UserID>123456</UserID>
<Value>Active</Value>
</User>
</root>
我想要的輸出是:
User ID, Active, Admin, Eligible
55555, Y, Y, Y,
123456, Y, N, N,
請注意,這些值始終相同(活動、管理員和合格),但用戶可以具有不同數量的值,如示例中所示。
目前這是我得到的:
<xsl:template match="/root">
<Header>
<xsl:text>User ID</xsl:text>
<xsl:value-of select="$comma"/>
<xsl:text>Active</xsl:text>
<xsl:value-of select="$comma"/>
<xsl:text>Admin</xsl:text>
<xsl:value-of select="$comma"/>
<xsl:text>Eligible</xsl:text>
<xsl:text>
</xsl:text>
</Header>
<xsl:for-each-group select="User" group-by="UserID">
<!-- User ID -->
<xsl:value-of select="UserID"/>
<xsl:value-of select="$comma"/>
<xsl:for-each-group select="current-group()" group-by="Value">
<xsl:value-of select="current-grouping-key()"/>
<xsl:value-of select="$comma"/>
</xsl:for-each-group>
<xsl:value-of select="$lineFeed"/>
</xsl:for-each-group>
</xsl:template>
該組并選擇正確的元素,但隨后我需要將它們放在正確的標題下(例如具有所需輸出的 ??axample)。
任何人都可以指出我正確的方向嗎?任何幫助將非常感激。
uj5u.com熱心網友回復:
如果我理解正確(如果非常大!),您想要執行以下操作:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/root">
<!-- header -->
<xsl:text>User ID, Active, Admin, Eligible </xsl:text>
<!-- rows -->
<xsl:for-each-group select="User" group-by="UserID">
<!-- User ID -->
<xsl:value-of select="UserID"/>
<xsl:text>, </xsl:text>
<!-- Active -->
<xsl:value-of select="if (current-group()/Value[.='Active']) then 'Y' else'N'"/>
<xsl:text>, </xsl:text>
<!-- Admin -->
<xsl:value-of select="if (current-group()/Value[.='Admin']) then 'Y' else'N'"/>
<xsl:text>, </xsl:text>
<!-- Eligible -->
<xsl:value-of select="if (current-group()/Value[.='Eligible']) then 'Y' else'N'"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
或更緊湊:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/root">
<!-- header -->
<xsl:text>User ID, Active, Admin, Eligible </xsl:text>
<!-- rows -->
<xsl:for-each-group select="User" group-by="UserID">
<xsl:value-of select="UserID, for $t in ('Active', 'Admin', 'Eligible') return if (current-group()/Value[.=$t]) then 'Y' else 'N'" separator=", "/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
請注意,結果與您發布的結果略有不同:每條記錄中都沒有尾隨逗號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/362516.html
標籤:xml 文件 xslt xslt-2.0 xslt-分组
上一篇:使用python從csv檔案中獲取最后一列的最后一行
下一篇:將陣列轉換為正確的形式
