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>
我在通过 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>