我想像这样修改一个很长的xml的属性:
<element index="0">
<subelement bla="asdf" />
<subelement bla="asdf" />
</element>
<element index="1">
<subelement bla="asdf" />
<subelement bla="asdf" />
</element>
...
我需要添加N每个索引属性的值。说N = 5。结果将是:
<element index="5">
<subelement bla="asdf" />
<subelement bla="asdf" />
</element>
<element index="6">
<subelement bla="asdf" />
<subelement bla="asdf" />
</element>
...
最简单的方法是什么?我认为它适用于XSLT,但我不知道该怎么做。
谢谢!
答案 0 :(得分:4)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<!-- copy everything verbatim -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- except "element" nodes -->
<xsl:template match="element">
<xsl:copy>
<xsl:attribute name="index">
<xsl:value-of select="@index + 5"/>
</xsl:attribute>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:3)
svick回答这是一个很好的解决方案。如果您必须保持确切的结构,请尝试:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="increment" select="5" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()[not(node())]">
<xsl:element name="{name()}" >
<xsl:apply-templates select="@*" />
</xsl:element>
</xsl:template>
<xsl:template match="element/@index">
<xsl:attribute name="index">
<xsl:value-of select="$increment + ." />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
以下是增加任意属性的一般解决方案:
#!/bin/bash
PROG=$(basename $0 )
: ${TMPDIR:=/tmp}
: ${INC:=1}
TMPFILE=$TMPDIR/$PROG.$$.xml
function usage() {
cat <<!
$PROG <attribute> <input-xml>
Increases all attributes named <attribute> in the <input-xml> XML file by 1 ( or \$INC )
!
exit 1
}
[ $# -eq 2 ] || usage
{
cat <<!
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<!-- copy everything verbatim -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- except "attribute-of-interest" node -->
<xsl:template match="@$1">
<xsl:attribute name="$1">
<xsl:value-of select=". + $INC"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
!
} xsltproc /dev/stdin $2 > $TMPFILE && mv $TMPFILE $2
显然这是svick的回答。我稍微更改了XSL以覆盖目标元素中的多个属性。 FWIW,我使用bash将其模板化。