首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换和组合多个xml文档

转换和组合多个xml文档
EN

Stack Overflow用户
提问于 2015-07-02 11:11:33
回答 1查看 122关注 0票数 0

我在Linux上有一个要求来托管Apache下的NuGet存储库。设计受到相当大的限制,并要求将包提要作为静态文件存储。所需输出格式的示例如下:http://chocolatey.org/api/v2/Packages

我试图从在*.nuspec档案中找到的*.nupkg文件生成这个文档,如下所示:

代码语言:javascript
复制
#!/bin/bash

#for pkg in nxlog git.install; do
#  curl -L http://chocolatey.org/api/v2/package/$pkg -o $pkg.nupkg
#done

unzip "*.nupkg" "*.nuspec"
xsltproc transform.xsl *.nuspec > Packages
rm -f *.nuspec

到目前为止,不正确的转换xslt如下所示:

代码语言:javascript
复制
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <feed xml:base="http://gallery-host/api/v2/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
    <title type="text">Packages</title>
    <id>http://gallery-host/api/v2/Packages</id>
    <updated></updated>
    <link rel="self" title="Packages" href="Packages" />
    <xsl:apply-templates />
  </feed>
  <xsl:template match="metadata">
    <entry>
      <id><xsl:value-of select="id"/></id>
      <title type="text"><xsl:value-of select="title"/></title>
      <summary type="text"><xsl:value-of select="summary"/></summary>
      <updated></updated>
      <author>
        <name><xsl:value-of select="authors"/></name>
      </author>
      <link rel="edit-media" title="V2FeedPackage">
        <xsl:attribute name="href">Packages(Id='<xsl:value-of select="id"/>',Version='<xsl:value-of select="version"/>')/$value</xsl:attribute>
      </link>
      <link rel="edit" title="V2FeedPackage">
        <xsl:attribute name="href">Packages(Id='<xsl:value-of select="id"/>',Version='<xsl:value-of select="version"/>')</xsl:attribute>
      </link>
      <category term="NuGetGallery.V2FeedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
      <content type="application/zip">
        <xsl:attribute name="src">http://chocolatey.org/api/v2/package/<xsl:value-of select="id"/>/<xsl:value-of select="version"/></xsl:attribute>
      </content>
      <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
        <d:Version><xsl:value-of select="version"/></d:Version>
        <d:Copyright><xsl:value-of select="copyright"/></d:Copyright>
        <!--
        <d:Created m:type="Edm.DateTime"></d:Created>
        <d:Dependencies></d:Dependencies>
        -->
        <d:Description><xsl:value-of select="description"/></d:Description>
        <!--
        <d:DownloadCount m:type="Edm.Int32"></d:DownloadCount>
        -->
        <d:GalleryDetailsUrl>http://gallery-host/packages/<xsl:value-of select="id"/>/<xsl:value-of select="version"/></d:GalleryDetailsUrl>
        <d:IconUrl><xsl:value-of select="iconUrl"/></d:IconUrl>
        <!--
        <d:IsLatestVersion m:type="Edm.Boolean"></d:IsLatestVersion>
        <d:IsAbsoluteLatestVersion m:type="Edm.Boolean"></d:IsAbsoluteLatestVersion>
        <d:IsPrerelease m:type="Edm.Boolean"></d:IsPrerelease>
        <d:Language m:null="true"></d:Language>
        <d:Published m:type="Edm.DateTime"></d:Published>
        -->
        <d:LicenseUrl><xsl:value-of select="licenseUrl"/></d:LicenseUrl>
        <!--
        <d:PackageHash></d:PackageHash>
        <d:PackageHashAlgorithm></d:PackageHashAlgorithm>
        <d:PackageSize m:type="Edm.Int64"></d:PackageSize>
        -->
        <d:ProjectUrl><xsl:value-of select="projectUrl"/></d:ProjectUrl>
        <!--
        <d:ProjectSourceUrl m:null="true"></d:ProjectSourceUrl>
        <d:PackageSourceUrl m:null="true"></d:PackageSourceUrl>
        <d:DocsUrl m:null="true"></d:DocsUrl>
        <d:MailingListUrl m:null="true"></d:MailingListUrl>
        <d:BugTrackerUrl m:null="true"></d:BugTrackerUrl>
        -->
        <d:ReportAbuseUrl>http://gallery-host/package/ReportAbuse/<xsl:value-of select="id"/>/<xsl:value-of select="version"/></d:ReportAbuseUrl>
        <d:ReleaseNotes><xsl:value-of select="releaseNotes"/></d:ReleaseNotes>
        <!--
        <d:PackageStatus></d:PackageStatus>
        <d:PackageSubmittedStatus m:null="true"></d:PackageSubmittedStatus>
        <d:RequireLicenseAcceptance m:type="Edm.Boolean"></d:RequireLicenseAcceptance>
        -->
        <d:Tags xml:space="preserve"><xsl:value-of select="tags"/></d:Tags>
        <d:Title><xsl:value-of select="title"/></d:Title>
        <!--
        <d:VersionDownloadCount m:type="Edm.Int32"></d:VersionDownloadCount>
        -->
      </m:properties>
    </entry>
  </xsl:template>
</xsl:stylesheet>

这将导致输出文件不包含xml标记(内容被正确地包括在内)。

如何更正我的transform.xsl以生成一个根<feed>元素,其中包含多个子<entry>元素(以便我的输出被格式化为http://chocolatey.org/api/v2/Packages)?

更新

感谢来自@Martin Honnen的指针和来自@Frédéric Hamidi的另一个 (为什么总是将名称空间踢进底层,使用xml?),我对转换做了进一步的介绍:

代码语言:javascript
复制
<?xml version="1.0" ?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
  <xsl:template match="/">
    <feed>
      <xsl:for-each select="p:package/p:metadata" xmlns:p="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <xsl:element name="entry">
          <xsl:element name="id"><xsl:value-of select="p:id"/></xsl:element>
          <xsl:element name="title">
            <xsl:attribute name="type">text</xsl:attribute>
            <xsl:value-of select="p:title"/>
          </xsl:element>
          <xsl:element name="summary">
            <xsl:attribute name="type">text</xsl:attribute>
            <xsl:value-of select="p:summary"/></xsl:element>
          <xsl:element name="author">
            <xsl:element name="name"><xsl:value-of select="p:authors"/></xsl:element>
          </xsl:element>
          <xsl:element name="link">
            <xsl:attribute name="rel">edit-media</xsl:attribute>
            <xsl:attribute name="title">V2FeedPackage</xsl:attribute>
            <xsl:attribute name="href">Packages(Id='<xsl:value-of select="p:id"/>',Version='<xsl:value-of select="p:version"/>')/$value</xsl:attribute>
          </xsl:element>
          <xsl:element name="link">
            <xsl:attribute name="rel">edit</xsl:attribute>
            <xsl:attribute name="title">V2FeedPackage</xsl:attribute>
            <xsl:attribute name="href">Packages(Id='<xsl:value-of select="p:id"/>',Version='<xsl:value-of select="p:version"/>')</xsl:attribute>
          </xsl:element>
          <xsl:element name="category">
            <xsl:attribute name="term">NuGetGallery.V2FeedPackage</xsl:attribute>
            <xsl:attribute name="scheme">http://schemas.microsoft.com/ado/2007/08/dataservices/scheme</xsl:attribute>
          </xsl:element>
          <xsl:element name="content">
            <xsl:attribute name="type">application/zip</xsl:attribute>
            <xsl:attribute name="src">http://chocolatey.org/api/v2/package/<xsl:value-of select="p:id"/>/<xsl:value-of select="p:version"/></xsl:attribute>
          </xsl:element>
        </xsl:element>
        <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
          <d:Version><xsl:value-of select="p:version"/></d:Version>
          <d:Copyright><xsl:value-of select="p:copyright"/></d:Copyright>
          <!--
          <d:Created m:type="Edm.DateTime"></d:Created>
          <d:Dependencies></d:Dependencies>
          -->
          <d:Description><xsl:value-of select="p:description"/></d:Description>
          <!--
          <d:DownloadCount m:type="Edm.Int32"></d:DownloadCount>
          -->
          <d:GalleryDetailsUrl>http://gallery-host/packages/<xsl:value-of select="p:id"/>/<xsl:value-of select="p:version"/></d:GalleryDetailsUrl>
          <d:IconUrl><xsl:value-of select="p:iconUrl"/></d:IconUrl>
          <!--
          <d:IsLatestVersion m:type="Edm.Boolean"></d:IsLatestVersion>
          <d:IsAbsoluteLatestVersion m:type="Edm.Boolean"></d:IsAbsoluteLatestVersion>
          <d:IsPrerelease m:type="Edm.Boolean"></d:IsPrerelease>
          <d:Language m:null="true"></d:Language>
          <d:Published m:type="Edm.DateTime"></d:Published>
          -->
          <d:LicenseUrl><xsl:value-of select="p:licenseUrl"/></d:LicenseUrl>
          <!--
          <d:PackageHash></d:PackageHash>
          <d:PackageHashAlgorithm></d:PackageHashAlgorithm>
          <d:PackageSize m:type="Edm.Int64"></d:PackageSize>
          -->
          <d:ProjectUrl><xsl:value-of select="p:projectUrl"/></d:ProjectUrl>
          <!--
          <d:ProjectSourceUrl m:null="true"></d:ProjectSourceUrl>
          <d:PackageSourceUrl m:null="true"></d:PackageSourceUrl>
          <d:DocsUrl m:null="true"></d:DocsUrl>
          <d:MailingListUrl m:null="true"></d:MailingListUrl>
          <d:BugTrackerUrl m:null="true"></d:BugTrackerUrl>
          -->
          <d:ReportAbuseUrl>http://gallery-host/package/ReportAbuse/<xsl:value-of select="p:id"/>/<xsl:value-of select="p:version"/></d:ReportAbuseUrl>
          <d:ReleaseNotes><xsl:value-of select="p:releaseNotes"/></d:ReleaseNotes>
          <!--
          <d:PackageStatus></d:PackageStatus>
          <d:PackageSubmittedStatus m:null="true"></d:PackageSubmittedStatus>
          <d:RequireLicenseAcceptance m:type="Edm.Boolean"></d:RequireLicenseAcceptance>
          -->
          <d:Tags xml:space="preserve"><xsl:value-of select="p:tags"/></d:Tags>
          <d:Title><xsl:value-of select="p:title"/></d:Title>
          <!--
          <d:VersionDownloadCount m:type="Edm.Int32"></d:VersionDownloadCount>
          -->
        </m:properties>
      </xsl:for-each>
      <xsl:for-each select="p:package/p:metadata" xmlns:p="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
        <xsl:element name="entry">
          <xsl:element name="id"><xsl:value-of select="p:id"/></xsl:element>
          <xsl:element name="title">
            <xsl:attribute name="type">text</xsl:attribute>
            <xsl:value-of select="p:title"/>
          </xsl:element>
          <xsl:element name="summary">
            <xsl:attribute name="type">text</xsl:attribute>
            <xsl:value-of select="p:summary"/></xsl:element>
          <xsl:element name="author">
            <xsl:element name="name"><xsl:value-of select="p:authors"/></xsl:element>
          </xsl:element>
          <xsl:element name="link">
            <xsl:attribute name="rel">edit-media</xsl:attribute>
            <xsl:attribute name="title">V2FeedPackage</xsl:attribute>
            <xsl:attribute name="href">Packages(Id='<xsl:value-of select="p:id"/>',Version='<xsl:value-of select="p:version"/>')/$value</xsl:attribute>
          </xsl:element>
          <xsl:element name="link">
            <xsl:attribute name="rel">edit</xsl:attribute>
            <xsl:attribute name="title">V2FeedPackage</xsl:attribute>
            <xsl:attribute name="href">Packages(Id='<xsl:value-of select="p:id"/>',Version='<xsl:value-of select="p:version"/>')</xsl:attribute>
          </xsl:element>
          <xsl:element name="category">
            <xsl:attribute name="term">NuGetGallery.V2FeedPackage</xsl:attribute>
            <xsl:attribute name="scheme">http://schemas.microsoft.com/ado/2007/08/dataservices/scheme</xsl:attribute>
          </xsl:element>
          <xsl:element name="content">
            <xsl:attribute name="type">application/zip</xsl:attribute>
            <xsl:attribute name="src">http://chocolatey.org/api/v2/package/<xsl:value-of select="p:id"/>/<xsl:value-of select="p:version"/></xsl:attribute>
          </xsl:element>
        </xsl:element>
        <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
          <d:Version><xsl:value-of select="p:version"/></d:Version>
          <d:Copyright><xsl:value-of select="p:copyright"/></d:Copyright>
          <!--
          <d:Created m:type="Edm.DateTime"></d:Created>
          <d:Dependencies></d:Dependencies>
          -->
          <d:Description><xsl:value-of select="p:description"/></d:Description>
          <!--
          <d:DownloadCount m:type="Edm.Int32"></d:DownloadCount>
          -->
          <d:GalleryDetailsUrl>http://gallery-host/packages/<xsl:value-of select="p:id"/>/<xsl:value-of select="p:version"/></d:GalleryDetailsUrl>
          <d:IconUrl><xsl:value-of select="p:iconUrl"/></d:IconUrl>
          <!--
          <d:IsLatestVersion m:type="Edm.Boolean"></d:IsLatestVersion>
          <d:IsAbsoluteLatestVersion m:type="Edm.Boolean"></d:IsAbsoluteLatestVersion>
          <d:IsPrerelease m:type="Edm.Boolean"></d:IsPrerelease>
          <d:Language m:null="true"></d:Language>
          <d:Published m:type="Edm.DateTime"></d:Published>
          -->
          <d:LicenseUrl><xsl:value-of select="p:licenseUrl"/></d:LicenseUrl>
          <!--
          <d:PackageHash></d:PackageHash>
          <d:PackageHashAlgorithm></d:PackageHashAlgorithm>
          <d:PackageSize m:type="Edm.Int64"></d:PackageSize>
          -->
          <d:ProjectUrl><xsl:value-of select="p:projectUrl"/></d:ProjectUrl>
          <!--
          <d:ProjectSourceUrl m:null="true"></d:ProjectSourceUrl>
          <d:PackageSourceUrl m:null="true"></d:PackageSourceUrl>
          <d:DocsUrl m:null="true"></d:DocsUrl>
          <d:MailingListUrl m:null="true"></d:MailingListUrl>
          <d:BugTrackerUrl m:null="true"></d:BugTrackerUrl>
          -->
          <d:ReportAbuseUrl>http://gallery-host/package/ReportAbuse/<xsl:value-of select="p:id"/>/<xsl:value-of select="p:version"/></d:ReportAbuseUrl>
          <d:ReleaseNotes><xsl:value-of select="p:releaseNotes"/></d:ReleaseNotes>
          <!--
          <d:PackageStatus></d:PackageStatus>
          <d:PackageSubmittedStatus m:null="true"></d:PackageSubmittedStatus>
          <d:RequireLicenseAcceptance m:type="Edm.Boolean"></d:RequireLicenseAcceptance>
          -->
          <d:Tags xml:space="preserve"><xsl:value-of select="p:tags"/></d:Tags>
          <d:Title><xsl:value-of select="p:title"/></d:Title>
          <!--
          <d:VersionDownloadCount m:type="Edm.Int32"></d:VersionDownloadCount>
          -->
        </m:properties>
      </xsl:for-each>
    </feed>
  </xsl:template>
</xsl:stylesheet>

输出仍然包含太多的feed元素,我认为这是由于xsltproc处理通配符/多个输入文件的方式(它正在为每个文件运行一个单独的转换,这实际上相当符合逻辑)。如果我能够摆脱这些问题,找到一种更好的方法来处理多个输入名称空间(而不是重复每个名称空间的转换代码),我将是一个快乐的兔子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-02 12:16:00

我想你想要取代

代码语言:javascript
复制
  <feed xml:base="http://gallery-host/api/v2/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
    <title type="text">Packages</title>
    <id>http://gallery-host/api/v2/Packages</id>
    <updated></updated>
    <link rel="self" title="Packages" href="Packages" />
    <xsl:apply-templates />
  </feed>

使用

代码语言:javascript
复制
<xsl:template match="/">
  <feed xml:base="http://gallery-host/api/v2/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
    <title type="text">Packages</title>
    <id>http://gallery-host/api/v2/Packages</id>
    <updated></updated>
    <link rel="self" title="Packages" href="Packages" />
    <xsl:apply-templates />
  </feed>
</xsl:template>

但是,您还需要将所有命名空间声明移到xsl:stylesheet,i.g。

代码语言:javascript
复制
<xsl:stylesheet xml:base="http://gallery-host/api/v2/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">...</xsl:stylesheet>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31182965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档