如何将除字段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>
它将按原样复制除"类别"字段之外的所有内容。