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



如何将除字段name="Category"之外的所有字段从xml复制到xslt?我使用

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

但当我预览结果时,它只显示字段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>

首先,表达式:

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

选择每个字段,因为Field元素的名称为"字段",因此不能为"类别"。你的意思可能是:

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

即不具有值为"Category"的name属性的Field元素。

接下来,将模板应用于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>

它将按原样复制除"类别"字段之外的所有内容。

相关内容

  • 没有找到相关文章

最新更新