Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 选择表中具有所有子元素属性的所有子元素。_Html_Xml_Xslt - Fatal编程技术网

Html 选择表中具有所有子元素属性的所有子元素。

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类型的所有元素作为行放入

假设我有以下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>
    <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>