XML в XML с использованием XSLT - PullRequest
2 голосов
/ 21 мая 2009

Я пытаюсь создать новый XML-файл из существующего, используя XSL. При записи нового файла я хочу замаскировать данные, появляющиеся в поле имени учетной записи.

Вот так выглядит мой XML:

<?xml version="1.0" encoding="UTF-8"?>
<Sumit>
    <AccountName>Sumit</AccountName>
      <CCT_datasetT id="Table">
       <row>
         <CCTTitle2>Title</CCTTitle2>
       </row>
       </CCT_datasetT>
</Sumit>

Вот мой код XSL:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />

  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

  <xsl:template match="@*">
    <xsl:attribute namespace="{namespace-uri()}" name="{name()}"/>
  </xsl:template>

<xsl:template match="AccountName">
<AccountName>acc_no</AccountName>
</xsl:template>

</xsl:stylesheet>

Когда я применяю код XSL к своему XML, я получаю следующий вывод:

<?xml version="1.0" encoding="UTF-16"?>
<Sumit>
<AccountName>acc_no</AccountName>
<CCT_datasetT id="">
<row>
<CCTTitle2>Title</CCTTitle2>
</row>
</CCT_datasetT>
</Sumit>

со следующими проблемами:

1) Создает вывод, используя кодировку UTF-16

2) Вывод второй строки:

<CCT_datasetT id="">

Значение атрибута (Таблица) отсутствует.

Может кто-нибудь сказать, пожалуйста, как мне избавиться от этих двух проблем. Большое спасибо.


@ Эван Ленц:

Вот код JavaScript:

var oArgs = WScript.Arguments;

if (oArgs.length == 0)
{
   WScript.Echo ("Usage : cscript xslt.js xml xsl");
   WScript.Quit();
}
xmlFile = oArgs(0) + ".xml";
xslFile = oArgs(1) + ".xsl";


var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load(xmlFile)

// Load the XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(xslFile)

// Transform
var msg = xml.transformNode(xsl)



var fso = new ActiveXObject("Scripting.FileSystemObject");



// Open the text file at the specified location with write mode

var txtFile = fso.OpenTextFile("Output.xml", 2, false, 0);

txtFile.Write(msg);
txtFile.close();

Создает вывод в новом файле «Output.xml», но я не знаю, почему кодировка меняется. Меня это больше беспокоит по следующей причине:

Мой входной XML со следующим кодом:

<Status></Status>

И на выходе это выглядит как

<Status>
</Section>

Введен возврат каретки для всех пустых тегов. Я не уверен, имеет ли это отношение к кодировке. Пожалуйста, предложите.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 21 мая 2009

Попробуйте это:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />

    <xsl:template match="@*|node()">
      <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
  </xsl:template>

    <!-- You don't actually need this template -->
    <!-- but I think this was what you were trying to do -->
    <xsl:template match="@*" priority="2">
      <xsl:attribute namespace="{namespace-uri()}" name="{name()}"><xsl:value-of select="."/></xsl:attribute>
    </xsl:template>

  <xsl:template match="AccountName" priority="2">
  <AccountName>acc_no</AccountName>
  </xsl:template>

</xsl:stylesheet>

Что касается вопроса UTF, то вы поступаете правильно.

с www.w3.org/TR/xslt: Атрибут encoding указывает предпочтительную кодировку, используемую для вывода дерева результатов. XSLT-процессоры должны соблюдать значения UTF-8 и UTF-16.

1 голос
/ 21 мая 2009

Удалите ваше второе правило шаблона. Первое шаблонное правило (правило идентификации) уже скопирует атрибуты для вас. Включая вторую (которая имеет явную инструкцию <xsl:attribute>), вы создаете конфликт - состояние ошибки, и процессор XSLT восстанавливается, выбирая тот, который появится позже в вашей таблице стилей. Причина, по которой атрибут id является пустым, заключается в том, что ваше второе правило создает новый атрибут с тем же именем, но без значения. Но опять же, это второе правило не нужно, так что вы должны просто удалить его. Это решит проблему с отсутствующим значением атрибута.

Что касается выходной кодировки, похоже, что ваш XSLT-процессор не соблюдает указанную вами директиву <xsl:output> или вызывается в контексте (например, на стороне сервера?), Где кодировка определяется структурой, а не кодом XSLT. Какой процессор XSLT вы используете и как его вызываете?

ОБНОВЛЕНИЕ (re: кодировка символов):

Метод сохранения (DOMDocument) Документация гласит:

Кодировка символов основана на атрибуте кодировки в объявлении XML, например <?xml version="1.0" encoding="windows-1252"?>. Если атрибут кодирования не указан, по умолчанию используется UTF-8.

Я бы попытался использовать transformNodeToObject () и save () вместо вывода в строку.

Я не проверял это, но вы, вероятно, хотите что-то вроде этого:

var result = new ActiveXObject("Microsoft.XMLDOM")

// Transform
xml.transformNodeToObject(xsl, result);

result.save("Output.xml");

ОБНОВЛЕНИЕ (re: нежелательные пробелы):

Если вы хотите иметь полный контроль над тем, какие пробелы появляются в результате, вы не должны указывать indent = "yes" для элемента <xsl:output>. Попробуйте удалить это.

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