Extraia Xpaths de todos os nós e, em seguida, seus atributos

Eu estou lutando com xslt dos últimos 2 dias, devido ao meu status inicial.Minha exigência é que, dado qualquer arquivo XML de entrada, eu quero que a saída seja uma lista de todos os XPaths de todas as tags na ordem em que aparecem o documento XML original (pai, pai, pais, lista de atributos / filho, pai / filho / childOFchild e assim por diante). O XSLT não deve ser específico para nenhum esquema XMl. Deve funcionar para qualquer arquivo XML, que é válido.

Ex:

Se o XML de entrada for:

<v1:Root>
<v1:UserID>test</v1:UserID>
<v1:Destination>test</v1:Destination>
<v1:entity name="entiTyName">
<v11:attribute name="entiTyName"/>
<v11:attribute name="entiTyName"/>
<v11:attribute name="entiTyName"/>
<v11:filter type="entiTyName">
<v11:condition attribute="entiTyName" operator="eq" value="{FB8D669E-D090-E011-8F43-0050568E222C}"/>
<v11:condition attribute="entiTyName" operator="eq" value="1"/>
</v11:filter>
<v11:filter type="or">
<v11:filter type="or">
<v11:filter type="and">
<v11:filter type="and">
<v11:condition attribute="cir_customerissuecode" operator="not-like" value="03%"/>
</v11:filter>
</v11:filter>
</v11:filter>
</v11:filter>
</v1:entity>
</v1:Root>

Eu quero que minha saída seja:

/v1:Root/v1:UserID
/v1:Root/v1:Destination
/v1:Root/v1:entity/@name
/v1:Root/v1:entity/v11:attribute
/v1:Root/v1:entity/v11:attribute/@name
/v1:Root/v1:entity/v11:attribute[2]
/v1:Root/v1:entity/v11:attribute[2]/@name
/v1:Root/v1:entity/v11:attribute[3]
/v1:Root/v1:entity/v11:attribute[3]/@name
/v1:Root/v1:entity/v11:filter/@type
/v1:Root/v1:entity/v11:filter/v11:condition
/v1:Root/v1:entity/v11:filter/v11:condition/@attribute
/v1:Root/v1:entity/v11:filter/v11:condition/@operator
/v1:Root/v1:entity/v11:filter/v11:condition/@value
/v1:Root/v1:entity/v11:filter/v11:condition[2]
/v1:Root/v1:entity/v11:filter/v11:condition[2]/@attribute
/v1:Root/v1:entity/v11:filter/v11:condition[2]/@operator
/v1:Root/v1:entity/v11:filter/v11:condition[2]/@value
/v1:Root/v1:entity/v11:filter[2]/v11:filter/@type
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/@type
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter/@type
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter/v11:condition
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter/v11:condition/@attribute
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter/v11:condition/@operator
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter/v11:condition/@value
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/@type
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition/@attribute
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition/@operator
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition/@value
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition[2]
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition[2]/@attribute
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition[2]/@operator
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition[2]/@value

Então, é basicamente todo o XPath de cada elemento, então o Xpath dos atributos dos elementos.

Eu tenho um XSLT comigo, que é assim:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no" />
    <xsl:template match="*[not(child::*)]">
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="concat('/', name())" />
            <xsl:if test="count(preceding-sibling::*[name() = name(current())]) != 0">
                <xsl:value-of
                    select="concat('[', count(preceding-sibling::*[name() = name(current())]) + 1, ']')" />
            </xsl:if>
        </xsl:for-each>

        <xsl:apply-templates select="*" />
    </xsl:template>

    <xsl:template match="/">
        <xsl:apply-templates select="*" />
    </xsl:template>

</xsl:stylesheet>

A saída que obtém Produced não atende a tags complexas e também aos atributos da tag na lista Xpath resultante :(.

Por favor, ajude-me a consertar este xslt para produzir a saída como mencionado acima.

A saída atual do XSLT acima é assim:

/v1:Root/v1:UserID
/v1:Root/v1:Destination
/v1:Root/v1:entity/v11:attribute
/v1:Root/v1:entity/v11:attribute[2]
/v1:Root/v1:entity/v11:attribute[3]
/v1:Root/v1:entity/v11:filter/v11:condition
/v1:Root/v1:entity/v11:filter/v11:condition[2]
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter/v11:condition
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition
/v1:Root/v1:entity/v11:filter[2]/v11:filter/v11:filter/v11:filter[2]/v11:condition[2]
/v1:Root/v1:entity/v11:filter[2]/v11:filter[2]/v11:filter/v11:condition
/v1:Root/v1:entity/v11:filter[2]/v11:filter[2]/v11:filter[2]/v11:condition
/v1:Root/v1:entity/v11:filter[2]/v11:filter[2]/v11:filter[2]/v11:condition[2]
/v1:Root/v1:entity/v11:filter[2]/v11:filter[2]/v11:filter[2]/v11:condition[3]

questionAnswers(1)

yourAnswerToTheQuestion