Xml 是否更改属性值而不创建新的输出文档?

Xml 是否更改属性值而不创建新的输出文档?,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我需要迭代一组XML文档,并使用XSLT2.0简单地更改一个属性的值。文档的其余部分以及文档名称必须相同 是否可以简单地更改现有文档而不创建新文档作为转换的输出?或者我需要复制文档、更改属性并将其命名为与原始文档相同的名称吗 编辑 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:x

我需要迭代一组XML文档,并使用XSLT2.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>

http://localserver.com/
/输出/

它不起作用。仅选择文本节点。如何才能使其正常工作?

,无法在适当的位置更改输入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完成后使用脚本/批处理文件/调用程序来命名。

好的,就地转换也是如此。谢谢你的回答!不客气,但请注意就地转换有点矛盾。到位意味着必须的、破坏性的变革;转换意味着在输入不变的基础上进行输出的功能性生产。是的,你完全正确:D有点愚蠢,但我只是想问一下。谢谢阿加尼编辑了我的问题,你能看看我的代码并帮我吗?@user3629892:你能发布一个新问题吗?请确保按照michael.hor257k的建议包含小样本输入和预期输出。如果您同意这一点,我建议我们将此问题的编辑回滚,因为它本身与此答案保持一致。谢谢。“它不起作用。”这不是一个有用的描述。发布一个可复制的示例,包括输入和预期输出-请参阅:。