XSLT& XPath:如何以最有效的方式更改XML文件?

时间:2010-02-04 14:36:21

标签: xml xslt xpath

我是XSLT& amp;的新手XPath所以请原谅我这个简单的问题。

我有以下XML文件:

<?xml version="1.0"?>
    <Configuration serviceName="Just Service" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
      <Page name="Books">
        <Instances count="5" />
        <ConfigurationSettings>
          <Setting name="index" value="true" />
          <Setting name="number" value="value1" />
          <Setting name="bookstorage" value="value2"/>
        </ConfigurationSettings>
      </Page>
      <Page name="Magazines">
        <Instances count="7" />
        <ConfigurationSettings>
          <Setting name="index" value="false" />
          <Setting name="number" value="value1" />
          <Setting name="magazinestorage" value="value3"/>
        </ConfigurationSettings>
      </Page>
    </Configuration>

我想要的只是更改以下值 ...

value1 - 数字(在两个地方); value2 - bookstorage ; value3 - 适用于 magazinestorage ;

... 保持所有其他内容不变

为此,我想使用msxsl.exe(Microsoft命令行实用程序)。能否请您给我一个XSLT样式表示例的提示?如何以最有效的方式使用XSLT处理初始XML文件?

谢谢, 外消旋

3 个答案:

答案 0 :(得分:5)

在XSLT中执行此操作的方法是使用默认模板来复制文档内容,例如:

<xsl:template match="*|@*|text()">
    <xsl:copy>
        <xsl:apply-templates select="*|@*|text()"/>
    </xsl:copy>
</xsl:template>

然后将样板添加到样式表中,该样板将与您要更改的特定节点相匹配。这些节点在匹配时将覆盖上面的默认复制模板。例如,如果您希望元素Setting的每个数字属性都具有值314,则可以添加模板:

<xsl:template match="Setting/@number">
    <-- this copies in an attribute 'number' in place; with different contents -->
    <xsl:copy>314</xsl:copy>    
<xsl:template/>

这两个模板以及您想要制作的其他替换模板都将以任意顺序存在于您的样式表中

答案 1 :(得分:2)

以下是一个示例XSLT 1.0样式表,它使用新值获取三个参数:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sc="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"
  exclude-result-prefixes="sc"
  version="1.0">

  <xsl:param name="p1" select="'foo'"/>
  <xsl:param name="p2" select="'bar'"/>
  <xsl:param name="p3" select="'foobar'"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="sc:Setting[@name = 'number']/@value">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="$p1"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="sc:Setting[@name = 'bookstorage']/@value">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="$p2"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="sc:Setting[@name = 'magazinestorage']/@value">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="$p3"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

我担心这个用例,并且使用xslt,从头开始构建一个完整的新文档会更容易。或者使用您选择的编程语言,您可以阅读DOM树并仅更改这些变量(如果需要,我可以将其显示为Java)。

在其他用例中,您可以通过处理让原始xml。查看here了解更多信息。