如何使用 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>