代码之家  ›  专栏  ›  技术社区  ›  Racoon

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

  •  0
  • Racoon  · 技术社区  · 14 年前

    我是xslt&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 -为了 书库 (二) 价值3 -为了 杂志存储 ;

    ……以及 保持所有其他内容不变 .

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

    谢谢, 风险控制

    3 回复  |  直到 14 年前
        1
  •  2
  •   Martin Honnen    14 年前

    下面是一个XSLT1.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
  •  5
  •   Vincent Marchetti    14 年前

    在XSLT中这样做的方法是使用一个默认模板,该模板只复制文档内容,例如:

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

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

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

    这两个模板,再加上您想要进行的任何其他替换,都将以任何顺序出现在样式表中。

        3
  •  0
  •   Community Navdeep Singh    7 年前

    我担心这个用例和XSLT会更容易从头构建一个完整的新文档。或者使用您选择的编程语言,您可以读取DOM树,只更改那些变量(如果需要,我可以用Java显示)。

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