我对 XML 和 XSL 样式表还很陌生,我的任务是为我们的一位客户创建样式表。我已经创建了一个以下列格式输出 XML 的样式表:
<Trip TripType="Normal">
<Plan BeginTime="2011-08-13T10:00:00" UserDefinedTripID="777" UserDefinedRouteID="777">
<PlanStop ArrivalTime="2011-08-13T15:30:00" ArrivalLock="true" SiteID="1" PassThru1="test1" PassThru2="test2" PassThru3="test3" PassThru4="test4">
<PlanNote Line1="Freeform Text" Line2="Line2" Line3="Line3" />
<PlanCargo Duration="60" BillID="" Weight="100" Units="100.0" XUnitTypeID="10" Action="Pick" />
<PlanNote Line1="Freeform Text" Line2="Line2" Line3="Line3" />
<PlanCargo Duration="60" BillID="" Weight="100" Units="100.0" XUnitTypeID="12" Action="Pick" />
</PlanStop>
</Plan>
</Trip>
我需要获取输出并将内容插入到 Trip 元素内的属性中,如下所示:
<Trip TripID="-1" CurrentRevisionNumber="1" IsDispatch="1" IsActive="0"
IsComplete="0" OrganizationID="4"
TripData="<Trip TripType="Normal">
<Plan BeginTime="2011-08-13T10:00:00" UserDefinedTripID="777"
UserDefinedRouteID="777">
<PlanStop ArrivalTime="2011-08-13T10:00:00" ArrivalLock=& quot;true" SiteID="1" PassThru1="test1" PassThru2=& quot;test2" PassThru3="test3" PassThru4="test4">
<PlanCargo Duration="45" BillID="" Weight=& quot;100" Units="100.0" XUnitTypeID="9" Action="Pick" />
</PlanStop> />
换句话说,我需要获取现有的 XML 输出并将其放入属性中,同时执行一些字符转换。
是的,它非常丑陋,但这就是他们想要的样子。我正在考虑制作另一个 XSL,它将复制原始 XSL 转换的 XML 输出并将其放置在一个属性中,同时将 <、>、"等转换为 <、>、"等(不确定它们叫什么).
我在互联网上搜索了解决方案,但我似乎找不到任何类似的解决方案(我想那是因为这是一个荒谬的请求)。如有必要,我可以提供我的原始 XSL,但如果可能,我宁愿不更改它。
提前致谢!
最佳答案
我会节省自己的时间、精力和因他人的愚蠢而沮丧,并将通过使用微小扩展函数的微小转换来实现这一点。
这是使用 .NET XslCompiledTransform XSLT 处理器的示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:my="my:my" exclude-result-prefixes="msxsl my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<t stupid="{my:stringize(.)}"/>
</xsl:template>
<msxsl:script language="c#" implements-prefix="my">
public string stringize(XPathNavigator doc)
{
return doc.InnerXml;
}
</msxsl:script>
</xsl:stylesheet>
当应用于任何 XML 文档时,它会生成具有 stupid
属性的顶级元素,该属性包含顶级元素主体的转义表示。
例如,当转换应用于此 XML 文档时:
<t>
<a>
<b x="y">
<!-- Comment here -->
<?aPI ?>
</b>
</a>
</t>
产生了想要的结果:
<t stupid="
 <a>
 <b x="y">
 <!-- Comment here -->
 <?aPI?>
 </b>
 </a>
" />
实现相同想法的转换很可能可以为几乎每个 XSLT 处理器编写,其扩展函数本身可以用多种编程语言编写。
关于xml - 将整个 XML 作为属性输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620147/