如何使用 XSLT 复制 XML 并添加到现有文本
How to copy XML and add to existing text using XSLT
我正在努力处理 XML 文件,我需要在其中添加一些 curly 大括号。我已经在使用 XSLT (1.0) 生成 XML 文件。唯一缺少的字符是 XML 文件中值周围的 { }。
源文件看起来像
<?xml version='1.0' encoding='utf-8'?>
<container>
<pan>
<id>1</id>
<input>
<url>thisfile-1.xml</url>
</input>
<output>
<url>thisoutput-1.txt</url>
</output>
</pan>
<pan>
<id>2</id>
<input>
<url>anotherfile-2.xml</url>
</input>
<output>
<url>oldoutput-2.txt</url>
</output>
</pan>
<pan>
<id>3</id>
<input>
<url>alsofile-3.xml</url>
</input>
<output>
<url>newoutput-3.txt</url>
</output>
</pan>
</container>
我需要改变的变量在container/pan/input/url
生成的文件应该看起来像
<?xml version='1.0' encoding='utf-8'?>
<container>
<pan>
<id>1</id>
<input>
<url>{thisfile-1.xml}</url>
</input>
<output>
<url>thisoutput-1.txt</url>
</output>
</pan>
<pan>
<id>2</id>
<input>
<url>{anotherfile-2.xml}</url>
</input>
<output>
<url>oldoutput-2.txt</url>
</output>
</pan>
<pan>
<id>3</id>
<input>
<url>{alsofile-3.xml}</url>
</input>
<output>
<url>newoutput-3.txt</url>
</output>
</pan>
</container>
url 是可变的,只有输入 url 应该改变而不是输出 url。
我尝试了一些字符串替换示例,但它们实际上是在替换内容,我想保留内容并只添加大括号。
任何想法将不胜感激,我现在正处于死胡同。
我现在使用的 XSLT 是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input/url/text()">
<xsl:text>replacetext</xsl:text>
</xsl:template>
</xsl:stylesheet>
这只会替换输入 url ....
这是我对 XSLT 的了解。
你已经设置好了一切。只是改变
<xsl:text>replacetext</xsl:text>
到
<xsl:value-of select="concat('{', ., '}')"/>
根据要求用 {
和 }
包裹现有的 input/url
文本 (.
)。
XSLT
这是完整的 XSLT,您明智地基于身份转换加上上述修复:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input/url/text()">
<xsl:value-of select="concat('{', ., '}')"/>
</xsl:template>
</xsl:stylesheet>
我正在努力处理 XML 文件,我需要在其中添加一些 curly 大括号。我已经在使用 XSLT (1.0) 生成 XML 文件。唯一缺少的字符是 XML 文件中值周围的 { }。
源文件看起来像
<?xml version='1.0' encoding='utf-8'?>
<container>
<pan>
<id>1</id>
<input>
<url>thisfile-1.xml</url>
</input>
<output>
<url>thisoutput-1.txt</url>
</output>
</pan>
<pan>
<id>2</id>
<input>
<url>anotherfile-2.xml</url>
</input>
<output>
<url>oldoutput-2.txt</url>
</output>
</pan>
<pan>
<id>3</id>
<input>
<url>alsofile-3.xml</url>
</input>
<output>
<url>newoutput-3.txt</url>
</output>
</pan>
</container>
我需要改变的变量在container/pan/input/url 生成的文件应该看起来像
<?xml version='1.0' encoding='utf-8'?>
<container>
<pan>
<id>1</id>
<input>
<url>{thisfile-1.xml}</url>
</input>
<output>
<url>thisoutput-1.txt</url>
</output>
</pan>
<pan>
<id>2</id>
<input>
<url>{anotherfile-2.xml}</url>
</input>
<output>
<url>oldoutput-2.txt</url>
</output>
</pan>
<pan>
<id>3</id>
<input>
<url>{alsofile-3.xml}</url>
</input>
<output>
<url>newoutput-3.txt</url>
</output>
</pan>
</container>
url 是可变的,只有输入 url 应该改变而不是输出 url。
我尝试了一些字符串替换示例,但它们实际上是在替换内容,我想保留内容并只添加大括号。 任何想法将不胜感激,我现在正处于死胡同。
我现在使用的 XSLT 是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input/url/text()">
<xsl:text>replacetext</xsl:text>
</xsl:template>
</xsl:stylesheet>
这只会替换输入 url .... 这是我对 XSLT 的了解。
你已经设置好了一切。只是改变
<xsl:text>replacetext</xsl:text>
到
<xsl:value-of select="concat('{', ., '}')"/>
根据要求用 {
和 }
包裹现有的 input/url
文本 (.
)。
XSLT
这是完整的 XSLT,您明智地基于身份转换加上上述修复:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input/url/text()">
<xsl:value-of select="concat('{', ., '}')"/>
</xsl:template>
</xsl:stylesheet>