gpt4 book ai didi

xml - 在 XSLT 中创建父/子层次结构的电子表格 XML

转载 作者:行者123 更新时间:2023-12-04 05:00:53 24 4
gpt4 key购买 nike

我有以下电子表格 XML:

<Workbook>
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<Cell><Data ss:Type="String">Parent</Data></Cell>
<Cell><Data ss:Type="String">Child</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">A</Data></Cell>
<Cell><Data ss:Type="String">B</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">A</Data></Cell>
<Cell><Data ss:Type="String">C</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">B</Data></Cell>
<Cell><Data ss:Type="String">D</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">B</Data></Cell>
<Cell><Data ss:Type="String">E</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">C</Data></Cell>
<Cell><Data ss:Type="String">F</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">C</Data></Cell>
<Cell><Data ss:Type="String">G</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>

我希望使用 Saxon XSLT 2.0 将其转换为以下格式:
<Something id="A">
<Something id="B">
<Something id="D"/>
<Something id="E"/>
</Something>
<Something id="C">
<Something id="F"/>
<Something id="G"/>
</Something>
</Something>

有没有人能帮忙解决这个问题?我相信答案在于递归 应用模板 (虽然我希望 for-each 可以达到同样的目的)。

非常感谢。

更新:作为对 Navin 的回应,我一直在尝试如下所示的 XSLT,但我担心我在咆哮错误的树(也许在我的组中开始?):
<xsl:stylesheet 
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
xpath-default-namespace="urn:schemas-microsoft-com:office:spreadsheet"
exclude-result-prefixes="o x ss html"
>

<xsl:output method="xml" indent="yes" />

<xsl:template match="Workbook/Worksheet[@ss:Name='Sheet1']/Table">
<xsl:variable name="row_header" select="count(Row/Cell[.='Parent']/preceding-sibling::Row)+1"/>
<xsl:apply-templates select="Row[position() > $row_header]">
<xsl:with-param name="row_header" select="$row_header"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="Row">
<xsl:param name="row_header"/>
<xsl:variable name="ChildId" select="Cell[count(ancestor::*/Row[$row_header]/Cell[.='Child']/preceding-sibling::Cell)+1]"/>
<xsl:variable name="ParentId" select="Cell[count(ancestor::*/Row[$row_header]/Cell[.='Parent']/preceding-sibling::Cell)+1]"/>
<xsl:for-each-group select="*" group-starting-with="Row">
<Something id="{$ChildId}">
<xsl:apply-templates select="current-group()[position() &gt; 1]" mode="Child">
<xsl:with-param name="ChildId" select="$ChildId"/>
</xsl:apply-templates>
</Something>
</xsl:for-each-group>
</xsl:template>

<xsl:template match="*" mode="Child">
<xsl:param name="ChildId"/>
<Something id="{$ChildId}"/>
</xsl:template>

</xsl:stylesheet>

最佳答案

类似下面的 xslt 就可以了。 (仅在 xlt 1.0 版中尝试过,并且 mamespace 存在一些问题。)假设第一行是标题,第一个单元格是父级,第二个是子级,这并不是很灵活。

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

<xsl:template match="/">
<xsl:variable name ="parent">
<xsl:value-of select="//Row[2]/Cell[1]/Data"/>
</xsl:variable>
<Something id="{$parent}">
<xsl:apply-templates select="//Row[Cell[position()=1 and Data=$parent]]" />
</Something>

</xsl:template>

<xsl:template match="Row">

<xsl:variable name ="child">
<xsl:value-of select="Cell[2]/Data"/>
</xsl:variable>
<Something id="{$child}">
<xsl:apply-templates select="//Row[Cell[position()=1 and Data=$child]]" />
</Something>
</xsl:template>
</xsl:styles

生成的输出是:
<?xml version="1.0"?>
<Something xmlns:ss="Sheet1" id="A">
<Something id="B">
<Something id="D"/>
<Something id="E"/>
</Something>
<Something id="C">
<Something id="F"/>
<Something id="G"/>
</Something>
</Something>

关于xml - 在 XSLT 中创建父/子层次结构的电子表格 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16166100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com