Xml 如何使用XSL在某个子节点级别添加新元素?

Xml 如何使用XSL在某个子节点级别添加新元素?,xml,xslt,Xml,Xslt,我想帮一个朋友解决一个电脑课带回家的小测验。我有一个简单的XML文件,如下所示,它定义了我在书架上拥有的DVD标题 <Inventory> <DVD> <Name>Captain America</Name> </DVD> <DVD> <Name>Green Lantern</Name> </DVD> <DVD&

我想帮一个朋友解决一个电脑课带回家的小测验。我有一个简单的XML文件,如下所示,它定义了我在书架上拥有的DVD标题

<Inventory>
    <DVD>
        <Name>Captain America</Name>
    </DVD>
    <DVD>
        <Name>Green Lantern</Name>
    </DVD>
    <DVD>
        <Name>Thor</Name>
    </DVD>
</Inventory>

美国队长
绿灯
雷神
假设“美国队长”和“雷神”都已签出,而“绿灯侠”仍然可用。我想将上面的XML文件转换为以下XML

<Inventory>
    <DVD>
        <Name>Captain America</Name>
        <Status>Checked-Out</Status>
    </DVD>
    <DVD>
        <Name>Green Lantern</Name>
        <Status>Available</Status>
    </DVD>
    <DVD>
        <Name>Thor</Name>
        <Status>Checked-Out</Status>
    </DVD>
</Inventory>

美国队长
退房
绿灯
可获得的
雷神
退房
有人可以分享如何利用XSL向每个节点添加Status元素吗?我只有下面的代码片段,但它为所有节点复制了相同的元素

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

<xsl:template match="DVD">
    <xsl:copy>
        <xsl:copy-of select="@*|node()"/>
        <Status>Checked-Out</Status>
    </xsl:copy>
</xsl:template>

退房

非常非常感谢…

您可以使用
xsl:param
将签出的DVD的名称传递到您的xsl中,并在此基础上添加
。通过使用
xsl:param
,可以从命令行传递值

下面是一个XSLT2.0示例,其中DVD名称在
xsl:param
中以管道分隔。我在
xsl:template match
中使用
tokenize()。所有其他DVD将获得“可用”状态

XSLT 2.0样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="checkedOut" select="'Captain America|Thor'"/>

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

  <xsl:template match="DVD[Name=tokenize($checkedOut,'\|')]">
    <xsl:copy>
      <xsl:apply-templates/>
      <status>Checked-Out</status>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="DVD">
    <xsl:copy>
      <xsl:apply-templates/>
      <status>Available</status>
    </xsl:copy>
  </xsl:template>  

</xsl:stylesheet>

退房
可获得的
应用于示例XML将生成以下输出:

<Inventory>
   <DVD>
      <Name>Captain America</Name>
      <status>Checked-Out</status>
   </DVD>
   <DVD>
      <Name>Green Lantern</Name>
      <status>Available</status>
   </DVD>
   <DVD>
      <Name>Thor</Name>
      <status>Checked-Out</status>
   </DVD>
</Inventory>

美国队长
退房
绿灯
可获得的
雷神
退房

希望这有帮助。

您的问题不是xslt本身。当前,.xml输入没有电影是否签出的指示器。那么,您将如何将其转换为缺少这些关键信息的其他内容呢?您是对的,但这是一个设计类测验,其中xml输入不包含任何有关签入或可用的信息……太棒了,这是一个非常好的解决方案。非常感谢您花时间解决这个问题。非常感谢。