【发布时间】:2017-11-24 15:59:12
【问题描述】:
我有一个 C# 应用程序,可以在 XslCompiledTransform 的 XSLT 转换的帮助下将 XML 结构复制到新的结构中。我是 XSLT 的初学者,现在我有点卡在我的 XSLT 代码上。 我希望此 XSLT 转换更改特定类型的所有元素的搜索路径,并在属性中使用匹配模式(从 Linux 文件路径到 Windows)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:from="http://example.com/schema/FieldSinks/v1.xsd" xmlns:sqlite="http://example.com/schema/SQLiteFieldSink/v1.xsd"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="winsrc">c:\data\</xsl:param>
<xsl:param name="linuxsrc">/var/persistent/data/</xsl:param>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="from:FieldSinkRoot//sqlite:SQLiteFieldSink/@*">
<xsl:for-each select="//sqlite:SQLiteFieldSink/@*[contains(.,'/var/persistent/data/')]">
<xsl:variable name="str" select='.' />
<xsl:variable name="str2" select="substring-before($str, $linuxsrc)" />
<xsl:variable name="str3" select="substring-after($str, $linuxsrc)" />
<xsl:variable name="str4" select="concat($str2,$winsrc)" />
<xsl:variable name="str5" select="concat($str4,$str3)" />
<xsl:attribute name="connectionString"><xsl:value-of select="$str5 "/></xsl:attribute>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用这个输入文件:
<?xml version="1.0" encoding="utf-8"?>
<FieldSinkRoot id="FieldSinksRoot" xmlns="http://example.com/schema/FieldSinks/v1.xsd">
<SQLiteFieldSink
id="HourValues"
idleTimeout="5000"
connectionString="Data Source=/var/persistent/data/fsSQLiteHour.db;Version=3;"
warningSearchLevel="2000"
warningOnZeroResults="false"
deleteOldFields="true"
keepFieldsInMonth="24"
xmlns="http://example.com/schema/SQLiteFieldSink/v1.xsd" >
</SQLiteFieldSink>
<SQLiteFieldSink
id="MinuteValues"
idleTimeout="5000"
connectionString="Data Source=/var/persistent/data/fsSQLiteMinute.db;Version=3;"
warningSearchLevel="2000"
warningOnZeroResults="false"
deleteOldFields="true"
keepFieldsInMonth="24"
xmlns="http://example.com/schema/SQLiteFieldSink/v1.xsd" >
</SQLiteFieldSink>
<LocalDatabaseFieldSink
id="Localhost"
idleTimeout="5000"
warningSearchLevel="1000"
warningOnZeroResults="true"
xmlns="http://example.com/schema/LocalDatabaseFieldSink/v1.xsd" />
</FieldSinkRoot>
我得到这个输出文件(新的 XML 文件),这是错误的,因为它看起来使用相同的字符串作为搜索路径并且文件名最终是错误的。两个元素获得相同的文件结尾 fsSQLiteMinute.db 而不是 fsSQLiteHour.db
任何帮助将不胜感激。
<?xml version="1.0" encoding="utf-8"?>
<FieldSinkRoot id="FieldSinksRoot" xmlns="http://example.com/schema/FieldSinks/v1.xsd">
<SQLiteFieldSink
connectionString="Data Source=c:\data\fsSQLiteMinute.db;Version=3;"
xmlns="http://example.com/schema/SQLiteFieldSink/v1.xsd" />
<SQLiteFieldSink
connectionString="Data Source=c:\data\fsSQLiteMinute.db;Version=3;"
xmlns="http://example.com/schema/SQLiteFieldSink/v1.xsd" />
<LocalDatabaseFieldSink
id="Localhost"
idleTimeout="5000"
warningSearchLevel="1000"
warningOnZeroResults="true"
xmlns="http://example.com/schema/LocalDatabaseFieldSink/v1.xsd" />
</FieldSinkRoot>
【问题讨论】:
-
仅供参考
XslCompiledTransform不支持 XSLT 2.0。您实际上并没有使用任何 2.0 功能,因此您应该将版本更改为 1.0。