如何将所有字段从xml复制到xslt?

时间:2014-10-27 03:08:11

标签: xml xslt xslt-1.0

如何将字段名称=“类别”以外的所有字段从xml复制到xslt?我用

Field[not(name()='Category')]

但是当我预览结果时,它只显示字段名称=“类别”而不是显示所有字段。

XML:

<Form name="Form1" type="TextView" label="Cash Pickup Form">

<Field name="Category" type="TextView" label="FormType" value="Form1"/>

<Field type="Delimiter"/>
<Field name="ContractNumber" type="TextView" label="Contract number" value=""/>
<Field type="Delimiter"/>
<Field name="ClientName" type="TextView" label="Name of Client" value=""/>
<Field name="BirthDate" type="TextView" label="Birthday" value=""/>
<Field name="DueDate" type="TextView" label="Due Date" value=""/>
</Form>

XSLT:

<xsl:variable name="Category" select="/Form/Field[@name='Category']/@value"/>
<xsl:template match="/">
<xsl:apply-templates select="Form"/>
</xsl:template>

<xsl:template match="Form">
<xsl:element name="Form">
  <xsl:attribute name="name">
    <xsl:value-of select="@name"/>
  </xsl:attribute>
  <xsl:attribute name="type">
    <xsl:value-of select="@type"/>
  </xsl:attribute>
  <xsl:attribute name="label">
    <xsl:value-of select="@label"/>
  </xsl:attribute>
  <xsl:copy-of select="namespace::*[not(name()='ns2') and not(name()='')]"/>
  <xsl:call-template  name="Arrange"/>
</xsl:element>
</xsl:template>

<xsl:template name="Arrange">
   <xsl:apply-templates select="Field[not(name()='Category')]"/>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

首先,表达式为:

Field[not(name()='Category')]

选择每个字段,因为Field元素的名称是&#39;字段&#39; - 因此它不能是&#39;类别&#39;。你可能意味着:

Field[not(@name='Category')]

这是一个Field元素,没有name属性,其值为&#39;类别&#39;。

接下来,您要将模板应用于Field - 但您没有匹配Field的模板,因此未应用任何内容。如果您将Arrange模板更改为:

<xsl:template name="Arrange">
   <xsl:apply-templates select="Field[not(@name='Category')]"/>
</xsl:template>

并添加:

<xsl:template match="Field">
   <xsl:copy-of select="."/>
</xsl:template>

你可能会得到你想要的结果。

当然,您可以将所有内容缩短为:

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

<xsl:template match="/Form">
    <xsl:copy>
        <xsl:copy-of select="@name | @type | @label | Field[not(@name='Category')]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

或者,如果您愿意:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Field[@name='Category']"/>

</xsl:stylesheet>

将按原样复制所有内容,但“类别”字段除外。