xml
  • xslt
  • xslt-2.0
  • 2016-01-14 137 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

    相关问题