Использование функции Document () в XSLT 1.0 - PullRequest
2 голосов
/ 04 мая 2010

Я запускаю преобразование с использованием кода .NET,

Если я не добавлю свойство "EnableDocumentFunction" в XSL-Setting, программа выдаст сообщение об ошибке .. "Usage of Document() function is prohibited",

На самом деле программа не редактируется и является своего рода доступной только для чтения. Можно ли редактировать сам код XSL, чтобы я мог использовать функцию document () ??

Примеры XSL и XML здесь:
Пример XML:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
  <xsl:variable name="State_Code_Trn">
    <State In="California" Out="CA"/>
    <State In="CA" Out="CA"/>
    <State In="Texas" Out="TX"/>
    <State In="TX" Out="TX"/>
  </xsl:variable>

  <xsl:template name="testing" match="test_node">
    <xsl:variable name="test_val">
      <xsl:value-of select="."/>
    </xsl:variable>
    <xsl:element name="{name()}">
      <xsl:choose>
      <xsl:when test="document('')/*/xsl:variable[@name='State_Code_Trn']
              /State[@In=$test_val]">
    <xsl:value-of select="document('')/*/xsl:variable[@name='State_Code_Trn']
              /State[@In=$test_val]/@Out"/>
      </xsl:when>
        <xsl:otherwise>
          <xsl:text>Other</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>



И образец XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <test_node>California</test_node>
  <test_node>CA</test_node>
  <test_node> CA</test_node>
  <test_node>Texas</test_node>
  <test_node>TX</test_node>
  <test_node>CAA</test_node>
  <test_node></test_node>
</root>

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

В дополнение к ответу @ Tim-C ​​вы можете использовать функцию расширения ext: node-set (), где префикс ext связан с пространством имен EXSLT: "http://exslt.org/common".

Это поддерживается XslCompiledTransform и сделает ваш XSLT-код немного более переносимым, поскольку EXSLT - это стандартная библиотека функций расширения.

2 голосов
/ 04 мая 2010

Функция document () здесь используется для доступа к самому документу XSLT и извлечения содержимого переменной xsl :. В этом случае вообще нет необходимости использовать функцию document ().

Поскольку вы используете Microsoft.Net здесь, вы должны иметь доступ к функциям расширения msxml для XSLT. Действительно, соответствующее пространство имен для msxml уже определено в документе XSLT

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

Это означает, что вы сможете использовать функцию набора узлов для прямого доступа к узлам в переменной State_Code_Tran напрямую. Для этого попробуйте изменить существующую функцию xsl: выберите следующим образом:

   <xsl:choose>
    <xsl:when test="msxsl:node-set($State_Code_Trn)/State[@In=$test_val]">
     <xsl:value-of select="msxsl:node-set($State_Code_Trn)/State[@In=$test_val]/@Out"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:text>Other</xsl:text>
    </xsl:otherwise>
   </xsl:choose>

Это должно привести к следующему выводу

<root>
<test_node>CA</test_node>
<test_node>CA</test_node>
<test_node>Other</test_node>
<test_node>TX</test_node>
<test_node>TX</test_node>
<test_node>Other</test_node>
<test_node>Other</test_node>
</root>

(Обратите внимание, что перед одним из «CA» в исходном XML у вас есть пробел, поэтому он выглядит как «Other». Вы можете добавить некоторую функцию обрезки, чтобы справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...