Как указано в других ответах, XPath не может изменять XML-документ и создавать новые узлы .
Любой узел может участвовать в наборе узлов только один раз из-за определения "set"
.
Однако XPath 2.0 дает нам новый тип последовательности , , который позволяет повторять элементы.
Чтобы элемент дважды появлялся в последовательности, нужно просто использовать оператор объединения последовательностей ","
, как в приведенном ниже выражении:
/*/ElementYouWant, /*/ElementYouWant
Поместите это в таблицу стилей XSLT2.0 так просто:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f xs"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<t>
<xsl:sequence select=
"/*/ElementYouWant, /*/ElementYouWant"/>
</t>
</xsl:template>
</xsl:stylesheet>
И применить это преобразование к этому документу XML:
<toplevel>
<ElementYouWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementYouWant>
</toplevel>
для получения желаемого результата:
<t>
<ElementYouWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementYouWant>
<ElementYouWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementYouWant>
</t>
Обратите внимание: если вы используете инструкцию <xsl:sequence>
, новая копия элемента <ElementYouWant>
не создается - поэтому в XSLT 2.0 рекомендуется использовать <xsl:sequence>
и избегать использования <xsl:copy-of>
, который создает (ненужные) копии узлов.