基于颜色匹配筛选XML图片,修改XSLT输出带编号image节点
Got it, let's figure out how to adjust your XSLT to output numbered <image1>, <image2>, etc. nodes instead of generic <image> tags—especially since you can't rely on position() with the original unordered image links (but we can make it work for our filtered set!).
Step 1: Context Setup
First, let's recap your setup with example code aligned to your description:
Source XML
<root> <imageLink color="red">summer.jpg</imageLink> <imageLink color="green">forest.jpg</imageLink> <imageLink color="red">sunset.jpg</imageLink> <imageLink color="blue">ocean.jpg</imageLink> </root>
Existing XSLT (Outputs Generic <image>)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <gallery> <xsl:for-each select="root/imageLink[@color='red']"> <image> <xsl:value-of select="."/> </image> </xsl:for-each> </gallery> </xsl:template> </xsl:stylesheet>
Current Output
<gallery> <image>summer.jpg</image> <image>sunset.jpg</image> </gallery>
Desired Output
<gallery> <image1>summer.jpg</image1> <image2>sunset.jpg</image2> </gallery>
Step 2: Modified XSLT to Generate Numbered Nodes
The key trick is using dynamic element names with xsl:element, combined with position() (which works perfectly here because we're already iterating over the filtered set of color-matched images).
Here's the adjusted code:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <gallery> <!-- Iterate only over images matching your color condition --> <xsl:for-each select="root/imageLink[@color='red']"> <!-- Dynamically create element names like "image1", "image2" --> <xsl:element name="image{position()}"> <xsl:value-of select="."/> </xsl:element> </xsl:for-each> </gallery> </xsl:template> </xsl:stylesheet>
How This Works
xsl:element name="image{position()}": This builds the element name by concatenating "image" with the current position in our filtered node list. Since we're only looping through color-matched images,position()starts at 1 and increments sequentially—exactly what we need for numbered nodes.- The
select="root/imageLink[@color='red']"ensures we only process the images you care about, so the numbering is tied directly to your filtered results, not the original messy order of links in the XML.
Testing It Out
When you run this modified XSLT against your source XML, you'll get the numbered <imageN> nodes you're looking for, regardless of how the original image links are ordered.
内容的提问来源于stack exchange,提问作者madeinevo

