【问题标题】:XPATH in XSLT - DITA XML filesXSLT 中的 XPATH - DITA XML 文件
【发布时间】:2013-02-16 05:50:49
【问题描述】:

我有一个名为“map.xml”的 XML,它调用另一个 xml“map1.xml”。Map.xml 引用了 map.xsl。

在 XSLT 中,我需要编写代码来获取 map1.xml 中存在的节点值吗?你们中的任何人都可以为此提出解决方案吗?

以下代码特定于 DITA 标准

map1.xml:

    <?xml version="1.0" encoding="UTF-8"?>
       <!-- code to refer XSLT -->
          <map title="DITA Topic Map">
  <topicref href="client.xml"/>
       </map>

map2.xml:

    <?xml version="1.0" encoding="UTF-8"?>
     <concept id="map2">
 <title>Client Rights</title>
 <conbody>
  <p>Part of your job as a healthcare provider.</p>
 </conbody>
       </concept>

【问题讨论】:

标签: dita


【解决方案1】:

使用 XSLT document() 函数看起来像是要走的路。

例如获取map2.xml中p元素的内容/值:

<xsl:value-of select="document('map2.xml')/concept/conbody/p"/>

尚未在您的示例中对此进行测试,但这就是我会尝试的!

【讨论】:

    【解决方案2】:

    使用 XSLT document() 函数访问单独的 XML 文档中的节点。可以在here 找到一个简单的示例(由 w3schools.com 提供)。

    我是新用户,所以 SO 阻止我在答案中发布第二个链接。这是我能做的最好的事情:XSLT 标准对 document() 的解释可以在 www.w3.org/TR/xslt#document 找到。

    【讨论】:

      【解决方案3】:

      我认为,源代码实际上应该是这样的(引用 DTD 或模式,而不是样式表):

      map.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd">
      <map title="DITA Topic Map">
        <topicref href="client.xml"/>
      </map>
      

      client.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
      <concept id="client.xml">
       <title>Client Rights</title>
       <conbody>
        <p>Part of your job as a healthcare provider.</p>
       </conbody>
      </concept>
      

      大卫的建议是正确的,它给你以下结果:

      Part of your job as a healthcare provider.
      

      对此进行改进:要利用 DITA 的专业化功能,您宁愿使用以下内容:

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="2.0">
      
      <xsl:output omit-xml-declaration="yes"/>
      
      <xsl:template match="*[contains(@class, ' map/topicref ') and @href]">
          <xsl:variable name="topic" select="document(@href, .)"/>
          <xsl:value-of select="$topic//*[contains(@class, ' topic/p ')]"/>
      </xsl:template>
      
      </xsl:stylesheet>
      

      对于样本数据,这会导致相同的结果。但是,如果您有一个从

      派生的专用段落元素 ,您仍然可以对新元素使用相同的转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        相关资源
        最近更新 更多