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>
似乎作品如果組元素已經存在,但我如果組元素不存在,則無法弄清楚如何使其工作。