繁体   English   中英

XSLT 如何通过 for-each 循环更改节点的值

[英]XSLT How to change values of nodes via for-each loop

我在通过 xslt:for-each 循环计算 XML 节点时遇到问题。

示例 XML 输入:

<body>
  <ID>1</ID>
  <foo>1</foo>
  <foo2>1</foo2>
  <sample>
    <dummy>1</dummy>
    <dummy2>1</dummy2>
  </sample>
</body>
<body>
  <ID>1</ID>
  <foo>1</foo>
  <foo2>1</foo2>
  <sample>
    <dummy>1</dummy>
    <dummy2>1</dummy2>
  </sample>
</body>
<body>
  <ID>1</ID>
  <foo>1</foo>
  <foo2>1</foo2>
  <sample>
    <dummy>1</dummy>
    <dummy2>1</dummy2>
  </sample>
</body>

我希望输出是这样的:

<body>
  <ID>1</ID>
  <foo>1</foo>
  <foo2>1</foo2>
  <sample>
    <dummy>1</dummy>
    <dummy2>1</dummy2>
  </sample>
</body>
<body>
  <ID>2</ID>
  <foo>1</foo>
  <foo2>1</foo2>
  <sample>
    <dummy>2</dummy>
    <dummy2>1</dummy2>
  </sample>
</body>
<body>
  <ID>3</ID>
  <foo>1</foo>
  <foo2>1</foo2>
  <sample>
    <dummy>3</dummy>
    <dummy2>1</dummy2>
  </sample>
</body>

我尝试使用 for-each 循环,但最终得到 1 2 3 个值而不是其中一个。

for-each 循环是解决问题的好方法还是有更好的方法?

让我们以格式良好的XML 作为输入开始:

XML

<root>
    <body>
        <ID>1</ID>
        <foo>1</foo>
        <foo2>1</foo2>
        <sample>
            <dummy>1</dummy>
            <dummy2>1</dummy2>
        </sample>
    </body>
    <body>
        <ID>1</ID>
        <foo>1</foo>
        <foo2>1</foo2>
        <sample>
            <dummy>1</dummy>
            <dummy2>1</dummy2>
        </sample>
    </body>
    <body>
        <ID>1</ID>
        <foo>1</foo>
        <foo2>1</foo2>
        <sample>
            <dummy>1</dummy>
            <dummy2>1</dummy2>
        </sample>
    </body>
</root>

现在,如果您只想通过更改ID的值来重新编号body元素,那么您可以简单地执行以下操作:

XSLT 1.0 [A]

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="body">
            <xsl:copy>
                <ID>
                    <xsl:value-of select="position()"/>
                </ID>
                <xsl:copy-of select="*[not(self::ID)]"/>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

要得到:

结果 [A]

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <body>
      <ID>1</ID>
      <foo>1</foo>
      <foo2>1</foo2>
      <sample>
         <dummy>1</dummy>
         <dummy2>1</dummy2>
      </sample>
   </body>
   <body>
      <ID>2</ID>
      <foo>1</foo>
      <foo2>1</foo2>
      <sample>
         <dummy>1</dummy>
         <dummy2>1</dummy2>
      </sample>
   </body>
   <body>
      <ID>3</ID>
      <foo>1</foo>
      <foo2>1</foo2>
      <sample>
         <dummy>1</dummy>
         <dummy2>1</dummy2>
      </sample>
   </body>
</root>

但是,您似乎还希望在dummy元素中具有相同的数字,这使得这更加复杂。 这是您可以查看它的一种方式:

XSLT 1.0 [B]

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="ID | dummy">
    <xsl:copy>
        <xsl:number count="body"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这是另一个:

XSLT 2.0 [B]

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

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

<xsl:template match="body">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:with-param name="num" select="position()" tunnel="yes"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="ID | dummy">
    <xsl:param name="num" tunnel="yes"/>
    <xsl:copy>
        <xsl:value-of select="$num"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

在这两种情况下。 结果将是:

结果 [B]

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <body>
      <ID>1</ID>
      <foo>1</foo>
      <foo2>1</foo2>
      <sample>
         <dummy>1</dummy>
         <dummy2>1</dummy2>
      </sample>
   </body>
   <body>
      <ID>2</ID>
      <foo>1</foo>
      <foo2>1</foo2>
      <sample>
         <dummy>2</dummy>
         <dummy2>1</dummy2>
      </sample>
   </body>
   <body>
      <ID>3</ID>
      <foo>1</foo>
      <foo2>1</foo2>
      <sample>
         <dummy>3</dummy>
         <dummy2>1</dummy2>
      </sample>
   </body>
</root>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM