我在通過 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 回圈是解決問題的好方法還是有更好的方法?
uj5u.com熱心網友回復:
讓我們以格式良好的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>
現在,如果您只想body通過更改 的值來重新編號元素ID,那么您可以簡單地執行以下操作:
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/316680.html
上一篇:制作簡化的Abbyyxml
下一篇:使用屬性決議SQL中的XML資料
