Xslt 更改XML节点结构

Xslt 更改XML节点结构,xslt,tags,Xslt,Tags,我有一个结果集结构,例如 <ResultSets> <ResultSet rowCount="100"> <Row> <InvoiceNr>12345</InvoiceNr> <InvoiceItem>0</InvoiceItem> <Year>2014</Year> &

我有一个结果集结构,例如

<ResultSets>
    <ResultSet rowCount="100">
        <Row>
            <InvoiceNr>12345</InvoiceNr>
            <InvoiceItem>0</InvoiceItem>
            <Year>2014</Year>
            <Month>201401</Month>
            <Week>201402</Week>
            <ItemCategory/>
            <BillingType/>
            <BPCodeSoldTo>123456</BPCodeSoldTo>
            <BPCodeShipTo/>
        </Row>
        <Row>
            <InvoiceNr>123452</InvoiceNr>
            <InvoiceItem>1</InvoiceItem>
            <Year>2014</Year>
            <Month>201401</Month>
            <Week>201402</Week>
            <ItemCategory/>
            <BillingType/>
            <BPCodeSoldTo>123452</BPCodeSoldTo>
            <BPCodeShipTo/>
            <BPCodeBillTo/>
        </Row>
    </ResultSet>
</ResultSets>

12345
0
2014
201401
201402
123456
123452
1.
2014
201401
201402
123452
我需要将结构更改为

<io>
<row>
  <col>12345</col>
  <col>0</col>
  <col>2014</col>
  <col>201401</col>
  <col>201402</col>
  <col/>
  <col/>
  <col>123456</col>
  <col/>
  <col/>
</row>
<row>
  <col>123452</col>
  <col>1</col>
  <col>2014</col>
  <col>201401</col>
  <col>201402</col>
  <col/>
  <col/>
  <col>123452</col>
  <col/>
  <col/>
</row>
</io>

12345
0
2014
201401
201402
123456
123452
1.
2014
201401
201402
123452
我现在已经用(这不是实际的代码,只是一个想法)完成了它,而且它是有效的。但是有没有一种方法可以不显式地标识列标记名,而只使用一个语句捕获所有子标记并将其放入值structure中呢

<row>
<xsl:foreach../RecordSets/RecordSet/Row>
  <col>
    <xsl:value of select = "InvoiceNr"/>
 </col>
<col>
<xsl:value of select = "InvoiceItem"/>
</col>
<col>
<xsl:value of select = "Year"/>
</col>
<col>
<xsl:value of select = "InvoiceNr"/>
 </col>
....
</xsl:foreach>
</row>

....
***另一个问题。按照我原来的结构。我可能有ResultSet/ResultSet或只是ResultSet(取决于它运行的查询类型),我如何忽略它,只说ResultSet/ResultSet/Row或ResultSet/Row都可以工作

有没有办法不显式标识列标记名并使用 语句,该语句只捕获所有子标记并将其放入值中 结构

<row>
<xsl:foreach../RecordSets/RecordSet/Row>
  <col>
    <xsl:value of select = "InvoiceNr"/>
 </col>
<col>
<xsl:value of select = "InvoiceItem"/>
</col>
<col>
<xsl:value of select = "Year"/>
</col>
<col>
<xsl:value of select = "InvoiceNr"/>
 </col>
....
</xsl:foreach>
</row>
这样试试

<xsl:template match="/">
    <io>
        <xsl:for-each select="ResultSets/ResultSet/Row">
            <row>
                <xsl:for-each select="*">
                    <col><xsl:value-of select="."/></col>
                </xsl:for-each>
            </row>
        </xsl:for-each>
    </io>
</xsl:template>


我可能有ResultSet/ResultSet或只是ResultSet(取决于类型) 我怎么能忽略这一点,只说其中一个呢 ResultSet/ResultSet/Row或ResultSet/Row可以工作吗

使用:




哦。。还有一件事。无论如何,要排除 陈述例如,选择 除了标记名=
?,其他所有内容

是,使用谓词:



Brilliant,有什么好书或资源可以学习吗?我真的需要快速地对XSLT和XPATH进行抱怨!但无论如何。非常感谢你@用户3379902我肯定有,但我不是问这个问题的合适人选。哦。。还有一件事。无论如何,要排除语句中的某些标记。例如,选择除标记名=??之外的所有内容??
<xsl:for-each select="*[not(self::EXEMPT_ID)]">