XML 文件:
<Item isNew="1">
<project_number>00123</project_number>
<name>Copy Stuff</name>
<owned_by_id>D9CB2DAFA027466490E50FBEF05E17E9</owned_by_id>
</Item>
预期产出:
<NEW>
<Item isNew="1">
<project_number>00123</project_number>
<name>Copy of PDP Template</name>
<owned_by_id>D9CB2DAFA027466490E50FBEF05E17E9</owned_by_id>
<new_classification>Test</new_classification>
<new_sales_id>9876</new_sales_id>
<new_sales_type>OEM</new_sales_type>
<new_product_line />
</Item>
</NEW>
XSL 样式表(生成不正确的输出(:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:cs="urn:cs"
exclude-result-prefixes="msxsl cs">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="node() | @*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:element name="NEW">
<xsl:call-template name="InnerTemplate" />
</xsl:element>
</xsl:template>
<xsl:template name="InnerTemplate">
<xsl:param name="DocumentToAdd">
<new_classification>Test</new_classification>
<new_sales_id>9876</new_sales_id>
<new_sales_type>OEM</new_sales_type>
<new_product_line />
</xsl:param>
<xsl:copy-of select="."/>
<xsl:copy-of select="$DocumentToAdd"/>
</xsl:template>
</xsl:stylesheet>
不正确的输出:
<NEW>
<Item isNew="1">
<project_number>00123</project_number>
<name>Copy Stuff</name>
<owned_by_id>D9CB2DAFA027466490E50FBEF05E17E9</owned_by_id>
</Item>
<new_classification>Test</new_classification>
<new_sales_id>9876</new_sales_id>
<new_sales_type>OEM</new_sales_type>
<new_product_line />
</NEW>
我仅限于 XSLT 1.0
如果我不是同时使用另一个模板添加根元素,我知道如何使用模板将新节点放入Item
中,但如果它需要在另一个模板中运行,我似乎无法弄清楚如何做到这一点。
我也知道我可以通过 2 个顺序转换来做到这一点,但就我而言,这不是一个选择。
如果要更改Item
节点,请使用与之匹配的模板。尝试以这种方式进行。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:cs="urn:cs"
exclude-result-prefixes="msxsl cs">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:param name="DocumentToAdd">
<new_classification>Test</new_classification>
<new_sales_id>9876</new_sales_id>
<new_sales_type>OEM</new_sales_type>
<new_product_line />
</xsl:param>
<xsl:template match="node() | @*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<NEW>
<xsl:apply-templates/>
</NEW>
</xsl:template>
<!-- template match for Item -->
<xsl:template match="Item">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<!-- add elements inside this node -->
<xsl:copy-of select="$DocumentToAdd"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在行动中查看它:http://xsltransform.net/6qjwabD。