Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my"
>
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<my:offsets>
<offset value="0">
<element name="invoker.ArrayOfDictionary"/>
</offset>
<offset value="2">
<element name="dictionary"/>
</offset>
<offset value="4">
<element name="invoker.Dictionary"/>
</offset>
<offset value="6">
<element name="name"/>
<element name="id"/>
</offset>
</my:offsets>
<xsl:variable name="vOffsets"
select="document('')/*/my:offsets"/>
<xsl:variable name="vNL" select="'
'"/>
<xsl:variable name="vSpaces"
select="' '"/>
<xsl:template match="*">
<xsl:variable name="vthisOffset" select=
"$vOffsets/*
[element/@name
=
name(current())
]
/@value
"/>
<xsl:value-of select=
"concat($vNL,
substring($vSpaces,1,$vthisOffset),
name(),
':'
)"
/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным) :
<invoker.ArrayOfDictionary>
<dictionary>
<invoker.Dictionary>
<id>gcide</id>
<name>The Collaborative International Dictionary of English v.0.48</name>
</invoker.Dictionary>
<invoker.Dictionary>
<id>wn</id>
<name>WordNet (r) 2.0</name>
</invoker.Dictionary>
<invoker.Dictionary>
<id>moby-thes</id>
<name>Moby Thesaurus II by Grady Ward, 1.0</name>
</invoker.Dictionary>
</dictionary>
</invoker.ArrayOfDictionary>
дает желаемый, правильный результат :
invoker.ArrayOfDictionary:
dictionary:
invoker.Dictionary:
id:gcide
name:The Collaborative International Dictionary of English v.0.48
invoker.Dictionary:
id:wn
name:WordNet (r) 2.0
invoker.Dictionary:
id:moby-thes
name:Moby Thesaurus II by Grady Ward, 1.0
Примечание :
Использование method="text"
в инструкции <xsl:output>
.
Все смещения определены для всех элементов в удобном дереве, которое можно сохранить в отдельном файле и изменить без необходимости касаться кода XSLT.