|
Subject: Re: [xsl] Copy XPATH From: "Vasu Chakkera vasucv@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Mon, 3 Feb 2025 22:31:57 -0000 |
will this work?
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="x">
<!-- Template to match all elements -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<!-- Add title attribute if the element has a title child -->
<xsl:if test="tl">
<xsl:attribute name="title">
<xsl:value-of select="tl"/>
</xsl:attribute>
</xsl:if>
<!-- Generate the XPath using the path() function and remove
Q{} -->
<xsl:attribute name="xpath">
<xsl:value-of select="replace(path(), 'Q\{\}', '')"/>
</xsl:attribute>
<!-- Copy the id attribute if present -->
<xsl:if test="@id">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
</xsl:if>
<!-- Copy other attributes except id -->
<xsl:apply-templates select="@*[name() != 'id']"/>
<!-- Apply templates to child elements -->
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- Template to copy attributes -->
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Result : <?xml version="1.0" encoding="UTF-8"?><bb xpath="/bb[1]">
<as title="The Title" xpath="/bb[1]/as[1]" id="ENCA" major.version="6"
minor.version="0">
<tl xpath="/bb[1]/as[1]/tl[1]">The Title</tl>
<b xpath="/bb[1]/as[1]/b[1]"/>
<ts title="TS Title text" xpath="/bb[1]/as[1]/ts[1]" id="ENCA_GC">
<tl xpath="/bb[1]/as[1]/ts[1]/tl[1]">TS Title text</tl>
<st title="ST Title Text" xpath="/bb[1]/as[1]/ts[1]/st[1]"
id="EA_T1" jr="IB">
<tl xpath="/bb[1]/as[1]/ts[1]/st[1]/tl[1]">ST Title Text</tl>
<st.body xpath="/bb[1]/as[1]/ts[1]/st[1]/st.body[1]">
<pr xpath="/bb[1]/as[1]/ts[1]/st[1]/st.body[1]/pr[1]">
<sp
xpath="/bb[1]/as[1]/ts[1]/st[1]/st.body[1]/pr[1]/sp[1]">
<sp.txt
xpath="/bb[1]/as[1]/ts[1]/st[1]/st.body[1]/pr[1]/sp[1]/sp.txt[1]"
align="centre" cont="n">
<emphasis
xpath="/bb[1]/as[1]/ts[1]/st[1]/st.body[1]/pr[1]/sp[1]/sp.txt[1]/emphasis[1]"
type="bold" shading="nil">INTRODUCTION</emphasis>
</sp.txt>
</sp>
</pr>
</st.body>
</st>
</ts>
</as>
</bb>
On Mon, 11 Nov 2024 at 07:32, Martin Honnen martin.honnen@xxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> XSLT/XPath 3 have a "path()" function.
>
>
> I am trying to copy XPATH along with attributes value in an OUTPUT xml
> file.
>
> XML:
> <bb>
> <as id="ENCA" major.version="6" minor.version="0">
> <tl>The Title</tl>
> <b/>
> <ts id="ENCA_GC">
> <tl>TS Title text</tl>
> <st jr="IB" id="EA_T1">
> <tl>ST Title Text</tl>
> <st.body>
> <pr>
> <sp>
> <sp.txt align="centre" cont="n">
> <emphasis type="bold"
> shading="nil">INTRODUCTION</emphasis>
> </sp.txt>
> </sp>
> </pr>
> </st.body>
> </st>
> </ts>
> </as>
> </bb>
>
> Output Required
>
> <as title="The Title" xpath="bb/as[1]" id=" <ts title="TS Title
> text" xpath="bb/as[1]/ts[1]" id="ENCA_GC">
> <st jr="IB" title="ST Title Text"
> xpath="/bb/as[1]/ts[1]/st[1]" id="EA_T1"/>
> <st.body xpath="bb/as[1]/ts[1]/st[1]/st.body[1]">
> <pr xpath="bb/as[1]/ts[1]/st[1]/st.body[1]/pr[1]">
> <sp
> xpath="bb/as[1]/ts[1]/st[1]/st.body[1]/pr[1]/sp[1]"/>
> <sp.txt count="n"
> xpath="bb/as[1]/ts[1]/st[1]/st.body[1]/pr[1]/sp[1]/sp.txt[1]">
> </sp.txt>
> </pr>
> </st.body>
> </ts>
> </as> <http://ACLL.CA%22%3EACLL.CA%3C/a%3E>
>
> XSL:
>
> <xsl:template match="as">
> <xsl:element name="as">
> <xsl:attribute name="title">
> <xsl:value-of select="title/node()"/>
> </xsl:attribute>
> <xsl:attribute name="xpath">
> <xsl:value-of select ="local-name()"/>
> </xsl:attribute>
> </xsl:element>
> </xsl:template>
>
> <xsl:template match="ts">
> <xsl:element name="ts">
> <xsl:attribute name="title">
> <xsl:value-of select="title/node()"/>
> </xsl:attribute>
> <xsl:attribute name="xpath">
> <xsl:value-of select="fn:generateXPath(guidecard)"/>
> </xsl:attribute>
> </xsl:element>
> </xsl:template>
>
> <xsl:function name="fn:generateXPath" as="xs:string">
> <xsl:param name="pNode" as="node()"/>
> <xsl:for-each select="$pNode/ancestor::*">
> <xsl:value-of select="name()" />
> </xsl:for-each>
> </xsl:function>
>
> <xsl:template match="st.body" >
> <st.body>
> <xsl:value-of select="fn:generateXPath(st.body)"/>
> </st.body>
> </xsl:template>
>
> Please suggest.
>
> Thanks
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/620062> (by
> email <>)
>
--
Vasu Chakkera
NodeLogic Limited
Oxford
www.node-logic.com
==============
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] XSL-List Guidelines, B Tommie Usdin btusd | Thread | Re: [xsl] Copy XPATH, Martin Honnen martin |
| [xsl] XSL-List Guidelines, B Tommie Usdin btusd | Date | Re: [xsl] Copy XPATH, Martin Honnen martin |
| Month |