如何使用XSLT复制XML并添加到现有文本

时间:2016-01-06 13:40:35

标签: xml xslt xslt-1.0

我正在努力处理一个XML文件,我需要在其中添加一些花括号。我已经在使用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>

网址是可变的,只应更改输入网址而不是输出网址。

我尝试了一些字符串替换示例,但实际上它们正在替换内容,我想保留内容并仅添加大括号。 任何想法都会受到赞赏,我现在已经走到了尽头。

我现在使用的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>

这只取代了输入网址.... 这是我对XSLT的了解。

1 个答案:

答案 0 :(得分:2)

你把一切都搞好了。只需改变

<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>