在不创建新输出文档的情况下更改属性值?
Change attribute value without creating new output document?
我需要遍历一堆 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>
没用。只有文本节点被选中。我怎样才能让它工作?
否,无法就地更改输入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 完成后使用 script/batch file/calling 程序来实现。
我需要遍历一堆 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>
没用。只有文本节点被选中。我怎样才能让它工作?
否,无法就地更改输入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 完成后使用 script/batch file/calling 程序来实现。