如何将字段名称=“类别”以外的所有字段从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>
答案 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>
将按原样复制所有内容,但“类别”字段除外。