www.webdeveloper.com
Results 1 to 7 of 7

Thread: XSL,XPath: How to use xpath expression in source xml

Hybrid View

  1. #1
    Join Date
    Aug 2007
    Posts
    4

    XSL,XPath: How to use xpath expression in source xml

    I would like to ask for help. For example my xml source has some attribute node whose value is an xpath expression. How would I use that value as an xpath expression in my xsl?

    e.g.

    <tag attr=/tag2/somechild/>
    <tag2><somechild>value</somechild></tag2>
    <tag3><somechild2>value2</somechild2></tag3>

    In my case, the value of the attribute "attr" is dynamic (changing), and I want my xsl file to access the value according to the value of "attr" (an xpath expression). How can I do this? That is, how can I write the xpath expression that would select the value that the value of the "attr" points to?

    In essence, I would like to have something like:
    <xsl:for-each select="the xpath expression in the value of attr">, and
    <xsl:value-of select="the xpath expression in the value of attr">
    but how can I do this?

    Thank you very much!

  2. #2
    Join Date
    May 2007
    Posts
    288
    exslt
    http://www.exslt.org/dyn/functions/evaluate/

    If you are able to call an external function, you could use either javascript's or .Net's SelectNodes property. eg http://www.thescripts.com/forum/thread177329.html

  3. #3
    Join Date
    Aug 2007
    Posts
    4
    Thanks! I'll try.

    Are there other ways, especially those that are innate in xsl. That is, anything that does not call external functions?

    Thanks in advance.

  4. #4
    Join Date
    May 2007
    Posts
    288
    If you have a really simple path, it's possible to do the value-of purely in XSLT. Basically, it's a recursive template, that holds 2 variables.
    1. Current Context position.
    2. Current String.
    Can't currently find the code for it, but am looking.

    For-each is harder, and would probably require the use of either multiple templates and/or a node-set extension function.

  5. #5
    Join Date
    May 2007
    Posts
    288
    Code:
    <xsl:template name="evaluate">
    	<xsl:param name="xpath"/>
    	<xsl:choose>
    		<xsl:when test="$xpath=''">
    			<xsl:value-of select="."/>
    		</xsl:when>
    		<xsl:when test="contains($xpath, '//')">
    			<xsl:variable name="temp" select="substring-after($xpath,'//')"/>
    			<xsl:variable name="searchNode">
    				<xsl:choose>
    					<xsl:when test="contains($temp, '/')">
    						<xsl:value-of select="substring-before($temp, '/')"/>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:value-of select="$temp"/>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:variable>
    			<xsl:for-each select="//*[name() = $searchNode]">
    				<xsl:call-template name="evaluate">
    					<xsl:with-param name="xpath" select="substring(substring-after($temp, $searchNode),2)"/>
    				</xsl:call-template>
    			</xsl:for-each>
    		</xsl:when>
    		<xsl:when test="starts-with($xpath, '/')">
    			<xsl:variable name="temp" select="substring-after($xpath,'/')"/>
    			<xsl:variable name="searchNode">
    				<xsl:choose>
    					<xsl:when test="contains($temp, '/')">
    						<xsl:value-of select="substring-before($temp, '/')"/>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:value-of select="$temp"/>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:variable>
    			<xsl:if test="/*[name() = $searchNode]">
    				<xsl:call-template name="evaluate">
    					<xsl:with-param name="context" select="/*"/>
    					<xsl:with-param name="xpath" select="substring(substring-after($temp, $searchNode),2)"/>
    				</xsl:call-template>
    			</xsl:if>
    		</xsl:when>
    		<xsl:when test="contains($xpath, '/')">
    			<xsl:variable name="nodeName" select="substring-before($xpath,'/')"/>
    			<xsl:for-each select="./*[name() = $nodeName]">
    				<xsl:call-template name="evaluate">
    					<xsl:with-param name="xpath" select="substring-after($xpath, '/')"/>
    				</xsl:call-template>
    			</xsl:for-each>
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:value-of select="*[name() = $xpath]"/>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    I couldn't find it, so I wrote this instead.
    Takes xpaths in forms
    node
    node/child/nextchild
    /root/node
    //nodeAnywhere/node

    etc.
    Wildcards * not accepted.
    Last edited by jkmyoung; 08-16-2007 at 12:41 PM.

  6. #6
    Join Date
    Aug 2007
    Posts
    4
    Thanks! I'll try this asap and let you know. It looks good, though!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center

"

"

X vBulletin 4.2.2 Debug Information

  • Page Generation 0.17200 seconds
  • Memory Usage 3,053KB
  • Queries Executed 13 (?)
More Information
Template Usage (30):
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_global_above_footer
  • (1)ad_global_below_navbar
  • (1)ad_global_header1
  • (1)ad_global_header2
  • (1)ad_navbar_below
  • (1)bbcode_code
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)headinclude_bottom
  • (6)memberaction_dropdown
  • (1)navbar
  • (4)navbar_link
  • (1)navbar_moderation
  • (1)navbar_noticebit
  • (1)navbar_tabs
  • (2)option
  • (6)postbit
  • (6)postbit_onlinestatus
  • (6)postbit_wrapper
  • (1)showthread_list
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available (6):
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files (27):
  • ./showthread.php
  • ./global.php
  • ./includes/class_bootstrap.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/functions_navigation.php
  • ./includes/class_friendly_url.php
  • ./includes/class_hook.php
  • ./includes/class_bootstrap_framework.php
  • ./vb/vb.php
  • ./vb/phrase.php
  • ./includes/functions_facebook.php
  • ./includes/functions_calendar.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_notice.php
  • ./includes/functions_threadedmode.php
  • ./packages/vbattach/attach.php
  • ./vb/types.php
  • ./vb/cache.php
  • ./vb/cache/db.php
  • ./vb/cache/observer/db.php
  • ./vb/cache/observer.php 

Hooks Called (71):
  • init_startup
  • friendlyurl_resolve_class
  • init_startup_session_setup_start
  • database_pre_fetch_array
  • database_post_fetch_array
  • init_startup_session_setup_complete
  • global_bootstrap_init_start
  • global_bootstrap_init_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • load_show_variables
  • load_forum_show_variables
  • global_state_check
  • global_bootstrap_complete
  • global_start
  • style_fetch
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • strip_bbcode
  • friendlyurl_clean_fragment
  • friendlyurl_geturl
  • forumjump
  • cache_templates
  • cache_templates_process
  • template_register_var
  • template_render_output
  • fetch_template_start
  • fetch_template_complete
  • parse_templates
  • fetch_musername
  • notices_check_start
  • notices_noticebit
  • process_templates_complete
  • friendlyurl_redirect_canonical
  • showthread_post_start
  • showthread_query_postids_threaded
  • showthread_threaded_construct_link
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • memberaction_dropdown
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • build_navigation_data
  • build_navigation_array
  • check_navigation_permission
  • process_navigation_links_start
  • process_navigation_links_complete
  • set_navigation_menu_element
  • build_navigation_menudata
  • build_navigation_listdata
  • build_navigation_list
  • set_navigation_tab_main
  • set_navigation_tab_fallback
  • navigation_tab_complete
  • fb_like_button
  • showthread_complete
  • page_templates