Html 选择表中具有所有子元素属性的所有子元素。
假设我有以下xml:Html 选择表中具有所有子元素属性的所有子元素。,html,xml,xslt,Html,Xml,Xslt,假设我有以下xml: <parent> <child1 attr1="value" attr2="value" attr3="value"/> <child1 attr1="value" attr2="value" attr3="value"/> <child1 attr1="value" attr2="value" attr3="value"/> </parent> 我想将child1类型的所有元素作为行放入
<parent>
<child1 attr1="value" attr2="value" attr3="value"/>
<child1 attr1="value" attr2="value" attr3="value"/>
<child1 attr1="value" attr2="value" attr3="value"/>
</parent>
我想将child1类型的所有元素作为行放入一个表中,该表由每个属性的一列组成,这非常简单。然而,我的问题是,子元素的类型和子元素属性的数量/类型在父元素的实例之间有所不同。下面是一些父实例可能包含的内容的示例
<parent>
<child2 attr1="value" attr2="value" attr3="value" attr4="value"/>
<child2 attr1="value" attr2="value" attr3="value" attr4="value"/>
<child2 attr1="value" attr2="value" attr3="value" attr4="value"/>
</parent>
好消息是在父元素中永远不会有两种类型的子元素,所以只要我为每种可能的子元素类型及其相关属性都有一个when子句,我就可以做到这一点。坏消息是在child元素上有很多变化,需要很长时间才能确保我已经解释了其中的每一个
我的问题是-是否有任何方法可以不加区别地对每个元素执行一个for-each,即选择所有子元素而不查找特定类型,同时自动将所有子元素属性选择为表格式,而不在foreach中显式地为每个属性指定以下内容:
<td><xsl:value-of select="attr1"/></td>
然后,根据父实例中子元素的类型及其相关属性的变化,可能会产生不同类型的表
这是可能的还是我运气不好?当然,这是可能的。假设您希望每个节点都变成一个节点。显然,您将根据父节点在传入文档中的实际位置调整select XPath
<xsl:template match="/">
<xsl:apply-templates select="indoc/parent"/>
</xsl:template>
<xsl:template match="parent">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
如果确实希望下的每个节点都变成一行,无论元素名称是什么,都可以将其压缩为两级嵌套,或者使用模板模式:
<xsl:template match="parent">
<table>
<xsl:apply-templates mode="make-row" />
</table>
</xsl:template>
<xsl:template match="*" mode="make-row">
<tr>
<xsl:for-each select="@*">
<td>
<xsl:value-of select="concat(local-name(), ':', .)"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>
这有点令人困惑:一个文档中是否会有多个父级?如果是,您希望最后有多少张桌子?每个父级一个表,还是一个具有不同宽度行的表?为了所有人?此外,当您说我想将child1类型的所有元素作为行放入一个表中时,不清楚是否会有其他子元素存在,如果是-当名称明显从父元素更改为父元素时,您如何选择所需的子元素。实际上,我在内容上弄错了,但确实会有许多父元素。我没有意识到的是,在一个父元素中实际上可以有多种类型的子元素。基本上,在这一点上,我只是将编译一个所有可能的变体的列表,这将需要一些时间,但也将允许我最终以更好的方式格式化所有内容。
<xsl:template match="parent">
<table>
<xsl:apply-templates mode="make-row" />
</table>
</xsl:template>
<xsl:template match="*" mode="make-row">
<tr>
<xsl:for-each select="@*">
<td>
<xsl:value-of select="concat(local-name(), ':', .)"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>