xml
  • xslt
  • xslt-2.0
  • 2016-01-14 136 views 1 likes 
    1

    我需要遍歷一堆XML文檔,並使用XSLT 2.0簡單地更改一個屬性的值。文檔的其餘部分以及文檔名稱必須相同。更改屬性值而不創建新的輸出文檔?

    是否可以簡單地更改現有文檔而不創建新文檔作爲轉換的輸出?或者我需要複製文件,更改屬性並將它們命名爲原始文件?

    編輯

    <?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:fn='http://www.w3.org/2005/xpath-functions' exclude-result-prefixes='xsl xs fn' xmlns:h="http://java.sun.com/jsf/html"> 
        <xsl:output method="xml" encoding="utf-8"/> 
        <xsl:strip-space elements="*"/> 
    
        <xsl:param name="files" select="collection('./output?select=*.html')"/> 
    
        <xsl:template match="/"> 
         <xsl:for-each select="$files"> 
          <xsl:variable name="fileName" select="tokenize(base-uri(), '/')[last()]"/> 
          <xsl:result-document method="xhtml" href="new/{$fileName}"> 
           <div> 
            <h:selectBooleanCheckbox value="pubs"/> 
            <xsl:copy> 
             <xsl:apply-templates select="@* | node()"/> 
            </xsl:copy> 
           </div> 
          </xsl:result-document> 
         </xsl:for-each> 
        </xsl:template> 
        <xsl:template match="@src"> 
         <xsl:variable name="folderName" select="tokenize(base-uri(), '/')[last()-2]"/> 
         <xsl:text>http://localserver.com/</xsl:text> 
         <xsl:value-of select="$folderName"/> 
         <xsl:text>/output/</xsl:text> 
         <xsl:value-of select="."/> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    它不工作。僅選擇文本節點。我怎樣才能使這個工作?

    +1

    「*不起作用。*」不是有用的描述。發佈一個**可重現的例子,包括一個輸入和期望的輸出 - 參見:[mcve]。 –

    回答

    1

    ,無法將輸入XML文檔更改到位。

    XSLT將輸入XML轉換爲輸出文件,通常也是XML;它從不修改文件。

    很容易通過身份變換得到你的目標,

    <?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
        <xsl:template match="@*|node()"> 
        <xsl:copy> 
         <xsl:apply-templates select="@*|node()"/> 
        </xsl:copy> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    加一個模板,你想改變的屬性相匹配:

    <xsl:template match="@oldAttName"> 
        <xsl:attribute name="newAttName">newAttValue</xsl:attribute> 
        </xsl:template> 
    

    當然,本場比賽的標準可以作爲複雜根據需要,新的屬性值可以從輸入XML中的數據派生而不是固定的,但是這說明了如何改變屬性的基本一般模式。

    如果您需要將生成的輸出文檔命名爲與輸入文檔相同,則可以在XSLT完成後使用腳本/批處理文件/調用程序執行此操作。

    +0

    好吧,所以在就地轉換。感謝您的回答! – user3629892

    +0

    不客氣,但請注意*就地轉換*會有點矛盾。 *就地*意味着勢在必行的破壞性變化; *轉型*意味着基於未改變的投入產出的功能。 – kjhughes

    +0

    是啊,你說得很對:D有點傻,但只是想我會問。再次感謝 – user3629892

    相關問題