以相同的节点名称和属性值获取XML表如何为此编写代码

时间:2019-01-02 18:33:41

标签: xml xslt

需要帮助为具有相同属性/属性和相同节点名称的XML编写XSL代码。

我尝试了<xsl:for-each。它有帮助,但它只为每个表行打印第一个值。

我正在获取的XML

<PLMXML>
  <Form>
    <TableRow id="id15" subType="new_part_no_row" tablePropertyName="new_part_no" index="0">    
      <ApplicationRef version="j8Tt$2HDltBKvA" label="j8Tt$2HDltBKvA" application="Teamcenter"/>  
      <TableColumn title="item_no" value="vbzvb"/>
    </TableRow>
    <TableRow id="id16" subType="new_part_no_row" tablePropertyName="new_part_no" index="1">
      <ApplicationRef version="j8Yt$2HDltBKvA" label="j8Yt$2HDltBKvA" application="Teamcenter"/>  
      <TableColumn title="item_no" value="vvb"/>  
    </TableRow>
  </Form>
</PLMXML>

XSL代码:

<table border="0" bordercolor="black" align="left" cellspacing="2" cellpadding="1" width="100%">
    <tr></tr>
</table>
<br/>

<table border="0" bordercolor="black" align="left" cellspacing="10" cellpadding="0" width="100%">
    <tr>
        <td>
            <strong>
                <font size="4">
                    <font color="#000080">TABLE PROP</font>
                </font>
            </strong>
        </td>
    </tr>
</table>

<table border="0" bordercolor="black" align="left" cellspacing="2" cellpadding="1" width="100%">
    <tr></tr>
</table>

<table border="1" bordercolor="black" align="left" cellspacing="2" cellpadding="1" width="50%" height="5%">

    <th>Item NO</th>
    <th>Desc</th>
    <xsl:for-each select="/plm:PLMXML/plm:Form/plm:TableRow">
        <tr>
            <td>
                <xsl:value-of select="/plm:PLMXML/plm:Form/plm:TableRow[@title='item_no' and @index=current()/@index]/@value"/>
            </td>
        </tr>
    </xsl:for-each>
</table>

我想显示如下输出。

ITEM NO
vbzvb 
vvb

1 个答案:

答案 0 :(得分:0)

xsl:for-each中,您位于TableRow元素上,这意味着xsl:value-of中的xpath表达式可以与此相对。但是,通过在表达式的开头使用/,您将忽略当前节点,而是从文档节点开始搜索。

您只需执行此操作即可获取“ {item_no”的TableColumn

<xsl:value-of select="plm:TableColumn[@title='item_no']/@value"/>

尝试使用此XSLT(您可以在http://xsltfiddle.liberty-development.net/jyH9rNx上看到它的使用情况)。请注意,您将必须更改plm的名称空间声明,以匹配真实XML中的实际名称

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:plm="plm.test">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <table border="1" bordercolor="black" align="left" cellspacing="2" cellpadding="1" width="50%" height="5%">
      <tr>
        <th>Item NO</th>
        <th>Desc</th>
      </tr>
      <xsl:for-each select="/plm:PLMXML/plm:Form/plm:TableRow">
        <tr>
          <td>
            <xsl:value-of select="plm:TableColumn[@title='item_no']/@value"/>
          </td>
          <td>
            <xsl:value-of select="plm:TableColumn[@title='desc']/@value"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>