我有以下XML结构:
<Main>
<Node1>Definite</Node1>
<Node2>Definite</Node2>
<Node3>Definite</Node3>
<Node4>Definite</Node4>
<Node5>Definite</Node5>
<Node6>Definite</Node6>
<A>Possible</A>
<B>Possible</B>
<C>Possible</C>
<D>Possible</D>
<E>Possible</E>
<F>Possible</F>
<G>Possible</G>
<H>Possible</H>
<I>Possible</I>
</Main>
名为单个字母的节点,例如。<A>
是XML结构中可能不存在的节点,而所有其他节点都是明确的。
我需要在结构中插入节点<ZZZ>
,以便它始终位于下面显示的位置。
<Main>
<Node1>Value</Node1>
<Node2>Value</Node2>
<Node3>Value</Node3>
<Node4>Value</Node4>
<Node5>Value</Node5>
<Node6>Value</Node6>
<A>Value</A>
<B>Value</B>
<C>Value</C>
<D>Value</D>
<E>Value</E>
<ZZZ>Value</ZZZ>
<F>Value</F>
<G>Value</G>
<H>Value</H>
<I>Value</I>
</Main>
所以说节点<E>
和<C>
以及<H>
不存在它会是:
<Main>
<Node1>Value</Node1>
<Node2>Value</Node2>
<Node3>Value</Node3>
<Node4>Value</Node4>
<Node5>Value</Node5>
<Node6>Value</Node6>
<A>Value</A>
<B>Value</B>
<D>Value</D>
<ZZZ>Value</ZZZ>
<F>Value</F>
<G>Value</G>
<I>Value</I>
</Main>
希望这个解释清楚:)
答案 0 :(得分:2)
这取决于哪些元素是必需的,哪些是可选的!例如。如果你能说&lt; F&gt;需要在F元素之前插入ZZZ-Element:
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="F">
<ZZZ>Value</ZZZ>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
如果你不能说,有一个requiered元素,你需要在主元素的模板中插入:
<xsl:template match="Main">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="Node1|Node2|Node3|Node4|Node5|Node6|A|B|C|D|E"/>
<ZZZ>Value</ZZZ>
<xsl:apply-templates select="F|G|H|I"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
更通用的解决方案,可以适应任何动态指定的名称和任意数量的明确或可能的名称:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:occurences>
<definites>
<definite>Node1</definite>
<definite>Node2</definite>
<definite>Node3</definite>
<definite>Node4</definite>
<definite>Node5</definite>
<definite>Node6</definite>
</definites>
<possibles>
<possible>A</possible>
<possible>B</possible>
<possible>C</possible>
<possible>D</possible>
<possible>E</possible>
<possible>F</possible>
<possible>G</possible>
<possible>H</possible>
<possible>I</possible>
</possibles>
</my:occurences>
<xsl:variable name="vOccurencies" select=
"document('')/*/my:occurences"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select=
"*[name() =
($vOccurencies/definites/definite
|
$vOccurencies/possibles/possible
[not(position()
>
string-length(substring-before($vOccurencies/possibles, 'F')))
]
)
]"/>
<ZZZ>Value</ZZZ>
<xsl:apply-templates select=
"*[name()
=
$vOccurencies/possibles/possible
[position()
>
string-length(
substring-before($vOccurencies/possibles, 'F')
)
]
]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<Main>
<Node1>Value</Node1>
<Node2>Value</Node2>
<Node3>Value</Node3>
<Node4>Value</Node4>
<Node5>Value</Node5>
<Node6>Value</Node6>
<A>Value</A>
<B>Value</B>
<C>Value</C>
<D>Value</D>
<E>Value</E>
<ZZZ>Value</ZZZ>
<F>Value</F>
<G>Value</G>
<H>Value</H>
<I>Value</I>
</Main>
产生了想要的正确结果:
<Main>
<Node1>Value</Node1>
<Node2>Value</Node2>
<Node3>Value</Node3>
<Node4>Value</Node4>
<Node5>Value</Node5>
<Node6>Value</Node6>
<A>Value</A>
<B>Value</B>
<C>Value</C>
<D>Value</D>
<E>Value</E>
<ZZZ>Value</ZZZ>
<F>Value</F>
<G>Value</G>
<H>Value</H>
<I>Value</I>
</Main>
请注意:
在真实世界的情况下,my:occurances
元素将位于其单独的XML文档中 - 因此XSLT代码没有硬编码的元素名称,并且在更改发生的xml文档时无需修改。