0
我需要确保XML文档总是包含这些节点:XSLT:确保默认内容的某些元素存在
<group>
<section>0001</section>
<head>0002</head>
<body>0003</body>
</group>
典型XML输入文件看起来像这样(分组节点应该总是先类别,摘要):
<story>
<group>
<section>section-content</section>
<head>head-content</head>
<body>body-content</body>
<extra>extra-content</extra>
</group>
<category>some text</category>
<summary>some text</summary>
</story>
但是不能保证group元素或它的任何子元素都会存在。
所以给出一个XML文档:
<story>
<category>some text</category>
<summary>some text</summary>
</story>
输出应该是这样的:
<story>
<group>
<section>0001</section>
<head>0002</head>
<body>0003</body>
</group>
<category>some text</category>
<summary>some text</summary>
</story>
的XSLT不应该修改现有的内容如。
<story>
<group>
<section>existing text</section>
<extra>existing text</extra>
</group>
<category>some text</category>
<summary>some text</summary>
</story>
应转变为:使用
<story>
<group>
<section>existing text</section>
<head>0002</head>
<body>0003</body>
<extra>existing text</extra>
</group>
<category>some text</category>
<summary>some text</summary>
</story>
Tomalak's答案为基础,我想出了这个:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:subst="http://tempuri.com/mysubst"
>
<xsl:strip-space elements="*"/>
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<!-- These defaults (elements and contents) can be modified at any time -->
<subst:defaults>
<subst:element name="group">
<subst:section>0001</subst:section>
<subst:head>0002</subst:head>
<subst:body>0002</subst:body>
</subst:element>
</subst:defaults>
<!-- this makes the above available as a variable -->
<xsl:variable name="defaults" select="document('')/*/subst:defaults" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="story[not(group)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:element name="group"></xsl:element>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="group">
<xsl:copy>
<xsl:copy-of select="@*|*"/>
<xsl:call-template name="create-defaults" />
</xsl:copy>
</xsl:template>
<!-- Insert the defaults-->
<xsl:template name="create-defaults">
<xsl:variable name="this" select="." />
<xsl:for-each select="$defaults/subst:element[@name = name($this)]/*">
<xsl:if test="not($this/*[name() = local-name(current())])">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- Remove the namespaces -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
似乎作品如果组元素已经存在,但我如果组元素不存在,则无法弄清楚如何使其工作。