С учетом следующего XML:
<root>
<group>
<e1>001</e1>
<e2>beep</e2>
<e2>bop</e2>
<e2>ork</e2>
<e2>ah</e2>
<e2>ah</e2>
</group>
<group>
<e1>002</e1>
<e2>beep</e2>
<e2>bop</e2>
<e2>ork</e2>
<e2>ah</e2>
<e2>ah</e2>
</group>
<group>
<e1>003</e1>
<e2>beep</e2>
<e2>bop</e2>
<e2>ork</e2>
<e2>ah</e2>
<e2>ah</e2>
</group>
<group>
<e1>004</e1>
<e2>beep</e2>
<e2>bop</e2>
<e2>ork</e2>
<e2>ah</e2>
<e2>ah</e2>
</group>
</root>
Обратите внимание, что элементы 'e2' в каждом элементе 'group' одинаковы, и это гарантировано в исходном документе.
Я пытаюсь использовать XSLT для следующих шагов:
- сохранить копию набора элементов 'e2',
- стереть все элементы 'group',
- создать набор групповых элементов по умолчанию со вставленным в него набором e2s
Желаемый результат будет выглядеть так:
<root>
<group>
<e1>default1</e1>
<e2>beep</e2>
<e2>bop</e2>
<e2>ork</e2>
<e2>ah</e2>
<e2>ah</e2>
</group>
<group>
<e1>default2</e1>
<e2>beep</e2>
<e2>bop</e2>
<e2>ork</e2>
<e2>ah</e2>
<e2>ah</e2>
</group>
</root>
Значения 'e1' в исходном документе не имеют значения, а значения 'e2' в выходном документе известны заранее и являются статическими. Только значения 'e2' являются динамическими, и мне нужно убедиться, что они все есть.
Я использовал шаблон, подобный этому ранее, когда заменял все элементы с некоторыми жестко заданными значениями перед этим:
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- Empty Template eliminates all but first 'group' element. -->
<xsl:template match="//group[preceding::group]"></xsl:template>
<xsl:template match="//group">
<xsl:element name="group">
<e1>default1</e1>
<!-- e2 elements inserted here somehow? -->
</xsl:element>
<xsl:element name="group">
<e1>default2</e1>
<!-- e2 elements inserted here somehow? -->
</xsl:element>
</xsl:template>
Я пытался сохранить эти элементы в переменной, но ничего не было вставлено в выходной HTML:
<xsl:variable name="e2Elements" select="//group[1]/e2"></xsl:variable>
<xsl:template match="//group">
<xsl:element name="group">
<e1>default1</e1>
<xsl:copy-of select="$e2Elements" />
</xsl:element>
</xsl:template>
Но я не уверен, как вставить элементы e2 в значения. Я использую SaxonHE9.8N и имею доступ к пространству имен exslt и xslt2.0