我有4个连续数字,前两个数字必须带有文本标签,最后两个数字带有字幕标记,使用XSLT,
我的输入XML文件是:
<images>
<image>
<url>insulin.jpg</url>
<caption>Caption Fig – Text Here</caption>
</image>
<image>
<url>medicine.jpg</url>
<caption>Caption Fig – Text Here</caption>
</image>
<image>
<url>power.jpg</url>
<caption>Caption Fig – Text Here</caption>
</image>
<image>
<url>injection.jpg</url>
<caption>Caption Fig – Text Here</caption>
</image>
</images>
我用的XSLT:
<xsl:stylesheet version="3.0">
<xsl:template match="images">
images: [
<xsl:apply-templates/>
]
</xsl:template>
<xsl:template match="images/image">
<xsl:if test="position() != 1">,</xsl:if>
{
<xsl:apply-templates/>
}
</xsl:template>
<xsl:template match="image/url">
<xsl:text>"url": "img/</xsl:text>
<xsl:value-of select="tokenize(., '/')[last()]"/>",
</xsl:template>
<xsl:template match="image/caption">
"caption": "<xsl:apply-templates/>",
</xsl:template>
</xsl:stylesheet>
我的输出为:
images: [
{
"url": "img/insulin.jpg",
"caption": "Caption Fig – Text Here",
}
,
{
"url": "img/medicine.jpg",
"caption": "Caption Fig – Text Here",
}
,
{
"url": "img/power.jpg",
"caption": "Caption Fig – Text Here",
}
,
{
"url": "img/injection.jpg",
"caption": "Caption Fig – Text Here",
}
]
但我希望前两张图片需要附带文字标签和标题,最后两张图片保持相同
预期的Json输出:
images: [
{
"url": "img/insulin.jpg",
"caption": {
"text": "Caption Fig – Text Here",
}
}
,
{
"url": "img/medicine.jpg",
"caption": {
"text": "Caption Fig – Text Here",
}
}
,
{
"url": "img/power.jpg",
"caption": "Caption Fig – Text Here",
}
,
{
"url": "img/injection.jpg",
"caption": "Caption Fig – Text Here",
}
]
请帮我解决这个问题。提前谢谢。
答案 0 :(得分:1)
执行此操作的一种方法是添加更高优先级的模板,以匹配在选定的前两个<s:Envelope>
<xsl:attribute name="xmlns:s"><xsl:value-of select="xmlns:soapenv"/></xsl:attribute>
<s:Body>
</s:Body>
</s:Envelope>
元素下出现的caption
元素
image
为了实现这一点,您应该更改匹配<xsl:template match="image[position() <= 2]/caption" priority="2">
"text": "<xsl:apply-templates/>",
</xsl:template>
的模板中的<xsl:apply-templates/>
,以明确选择images
元素
image
这是因为它可能会拾取空白节点,并影响新模板中的位置检查(因为position()指的是所选节点集中的位置,不一定是文档中的位置)。
试试这个XSLT
<xsl:template match="images">
images: [
<xsl:apply-templates select="image" />
]
</xsl:template>