2017-07-19 78 views
0

我是xsl領域的新人。我有以下的XML格式。如何使用xsl創建xml的動態節點名稱?

<root> 
    <docs> 
     <doc> 
     <actor_name_1>aaa</actor_name_1> 
    <url_1>dddd</url_1> 
    </doc> 
    <doc> 
    <actor_name_2>bbb</actor_name_2> 
    <url_2>dddd</url_2> 
    </doc> 
    <doc> 
     <actor_name_3>ccc</actor_name_3> 
     <url_3>dddd</url_3> 
    </doc> 
    </docs> 
    </root> 

我想要得到與數字小的動態值(如1,2等)在XSLT <actor_name_>節點的值。像作爲

<xsl:for-each select="//root/docs/doc"> 
<xsl:value-of select="actors_name_">position()</xsl:value-of> 
<xsl:value-of select="url_">position()</xsl:value-of> 
</xsl:for-each> 

輸出將被..

Actor 1 aaaa url 1 ddddd 
Actor 2 bbb url 2 ddddd 
Actor 3 ccc url 3 sss 

請幫助我。如何獲得節點的動態值?

+0

請修改您的問題並添加預期結果。還解釋了爲什麼你需要爲'actor_name'節點編號,當它們已經編號時(更不用說這樣的編號是不好的做法)。 –

+0

是的,這是不好的做法。但是xml不是由我創建的,它是由某個客戶端提供的。我添加了輸出。請幫幫我。感謝您的評論。 –

+0

所需變革的邏輯尚不完全清楚。 –

回答

-1

您可以使用starts-with()函數來檢查節點名稱。以下代碼片段將幫助您獲取來自<actor_name_*><url_*>節點的所有值。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="utf-8" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="//root/docs/doc"> 
      <xsl:variable name="index" select="position()" /> 
      <xsl:variable name="actorName" select="./*[starts-with(local-name(), 'actor_name_')]" /> 
      <xsl:variable name="url" select="./*[starts-with(local-name(), 'url_')]" /> 
      <xsl:value-of select="concat('Actor ', $index, ' ', $actorName, ' url ', $index, ' ', $url, '&#10;')" /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

另外,通過@邁克爾所建議的,請檢查附加數量的節點作爲節點都在相同的父即<doc>內重複和編號是沒有必要的要求。

+0

#Aniket謝謝你的回答。請現在根據我的xml解釋。 –

+0

請分享您的輸出XML的外觀。基於輸出XML,可以共享具體答案。 –

+0

我添加了輸出,我想要的。請解釋一下。 –

0

這個問題並不完全清楚。如果 - 因爲它似乎 - 你想製作一個製表符分隔文本文件作爲輸出,你很可能做的只是:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" /> 

<xsl:template match="/root"> 
    <xsl:for-each select="docs/doc"> 
     <xsl:text>Actor </xsl:text> 
     <xsl:value-of select="position()" /> 
     <xsl:text>&#9;</xsl:text> 
     <xsl:value-of select="*[1]" /> 
     <xsl:text>&#9;</xsl:text> 
     <xsl:text>url </xsl:text> 
     <xsl:value-of select="position()" /> 
     <xsl:text>&#9;</xsl:text> 
     <xsl:value-of select="*[2]" /> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

應用到給定的例子,結果會成爲:

Actor 1 aaa url 1 dddd 
Actor 2 bbb url 2 dddd 
Actor 3 ccc url 3 dddd