[英]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.