通过xslt

时间:2016-11-08 10:53:17

标签: xml xslt attributes

我有以下xml文件:

<Book description="for beginners" name="IT Book">
    <Available>yes</Available>
    <Info pages="500.</Info>
</Book>

我希望它看起来像这样:

<Book description="for pros" name="IT Book">
    <Available>yes</Available>
    <Info pages="500.</Info>
</Book>

我查找了如何在互联网上正确修改xml文档。我发现首先我应该声明一个模板来复制所有东西:

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

但是,我不知道如何为实际修改编写模板。感谢您帮助初学者。

编辑:到目前为止,这是我的样式表(根据uL1的要求):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sig="http://www.w3.org/2000/09/xmldsig#">
    <xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>

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

    <xsl:template match="@description='for beginners'">
        <xsl:attribute name="{name()}">
            <xsl:text>for pros</xsl:text>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

许多其他主题已经回答了这个问题。例如。 XSLT: How to change an attribute value during <xsl:copy>?

在您的情况下,除了身份复制模板之外,您还需要一个与您的属性description匹配的模板。

<xsl:template match="@description"> <!-- @ matches on attributes, possible to restrict! -->
  <xsl:attribute name="{name()}">   <!-- creates a new attribute with the same name -->
    <xsl:text>for pros</xsl:text>   <!-- variable statement to get your desired value -->
  </xsl:attribute>
</xsl:template>

编辑1 (更多信息导致错误)

一个完整,有效,可运行的脚本将是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

  <xsl:template match="@description[. = 'for beginners']">
    <xsl:attribute name="{name()}">
      <xsl:text>for pros</xsl:text>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>