我有以下xml文件:
1)source.xml
libraryDependencies += "org.apache.bahir" %% "spark-streaming-twitter" % "2.0.1"
2)values.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Name><SSTVal>Name</SSTVal></Name>
<Version><SSTVal>Version</SSTVal></Version>
<Messages>
<Message><SSTVal>Message</SSTVal></Message>
</Messages>
</root>
我正在尝试编写一个xslt文件,该文件在第一个文件中搜索每次出现的SSTVal,并将其替换为第二个文件中匹配SSTVal的值,因此结果看起来像
<?xml version="1.0" encoding="UTF-8"?>
<Values>
<SSTVal name="Name">Test Name</SSTVal>
<SSTVal name="Version">1.2.3</SSTVal>
<SSTVal name="Message">Hello World!</SSTVal>
</Values>
我到目前为止编写了以下xslt转换,它只替换了一个特定节点,但是使用了来自values.xml的所有值
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Name>Test Name</Name>
<Version>1.2.3</Version>
<Messages>
<Message>Hello World!</Message>
</Messages>
</root>
你能帮我改变xslt以替换匹配的元素吗? 提前谢谢!
编辑:将使用XSLT 1.0
答案 0 :(得分:0)
将<xsl:variable name="vReps" select="document('file:///c:/test/values.xml')"/>
更改为<xsl:variable name="vReps" select="document('file:///c:/test/values.xml')//SSTVal"/>
,然后能够更改
<xsl:template match="SSTVal[text()='Version']">
<xsl:value-of select="$vReps"/>
</xsl:template>
到
<xsl:template match="SSTVal[. = $vReps/@name]">
<xsl:value-of select="$vReps[current() = @name]"/>
</xsl:template>
在XSLT 1.0中不允许在模式中使用变量引用,因此我们需要在模板中进行检查:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:variable name="vReps" select="document('values.xml')//SSTVal"/>
<xsl:template match="@* | node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SSTVal">
<xsl:choose>
<xsl:when test="$vReps[current() = @name]">
<xsl:value-of select="$vReps[current() = @name]"/>
</xsl:when>
<xsl:otherwise>
<!-- not sure you want to raise an error with xsl:message or leave the element -->
<xsl:call-template name="identity"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
在XSLT 2.0中,我们可以将代码简化为
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:param name="value-uri" select="'values.xml'"/>
<xsl:variable name="value-doc" select="document($value-uri)"/>
<xsl:key name="val" match="SSTVal" use="@name"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SSTVal[key('val', ., $value-doc)]">
<xsl:value-of select="key('val', ., $value-doc)"/>
</xsl:template>
</xsl:stylesheet>