xml - 将整个 XML 作为属性输出

标签 xml xslt xpath xslt-1.0

我对 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="&lt;Trip TripType=&quot;Normal&quot;&gt;
  &lt;Plan BeginTime=&quot;2011-08-13T10:00:00&quot; UserDefinedTripID=&quot;777&quot;
  UserDefinedRouteID=&quot;777&quot;&gt;
    &lt;PlanStop ArrivalTime=&quot;2011-08-13T10:00:00&quot; ArrivalLock=&    quot;true&quot; SiteID=&quot;1&quot; PassThru1=&quot;test1&quot; PassThru2=&    quot;test2&quot; PassThru3=&quot;test3&quot; PassThru4=&quot;test4&quot;&gt;
    &lt;PlanCargo Duration=&quot;45&quot; BillID=&quot;&quot; Weight=&    quot;100&quot; Units=&quot;100.0&quot; XUnitTypeID=&quot;9&quot; Action=&quot;Pick&quot;     /&gt;
    &lt;/PlanStop&gt; />

换句话说,我需要获取现有的 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="&#xD;&#xA;  &lt;a&gt;&#xD;&#xA;    &lt;b x=&quot;y&quot;&gt;&#xD;&#xA;      &lt;!--  Comment here --&gt;&#xD;&#xA;      &lt;?aPI?&gt;&#xD;&#xA;    &lt;/b&gt;&#xD;&#xA;  &lt;/a&gt;&#xD;&#xA;" />

实现相同想法的转换很可能可以为几乎每个 XSLT 处理器编写,其扩展函数本身可以用多种编程语言编写。

关于xml - 将整个 XML 作为属性输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620147/

相关文章:

javascript - 从PHP中的字符串获取多个图像src

不使用注释的 Java 代码到 XML/XSD

python - 访问字典中的 Plist 项

xml - 在 HTTP 查询中为 XML 文档指定自定义 XSL 文件

php - xslt处理器设置参数: send an undefined number of params

java - 我想使用 xpath 读取 xml 并获取 java 中父级的计数

xml - 马克逻辑 8 : Cannot load a XML document to MarkLogic database using cURL

android - 如何删除 XML 中标签之间的空格

xml - 获取祖先节点的后代节点的位置,不一定是兄弟节点

使用 XML-Package 在 R 中使用 XPath 检索图像源