2016-05-11 3 views
0

У меня есть источник XML:XSLT, сделать преобразование для дочернего узла, когда атрибут родительского узла совпадает со значением атрибута другого узла

<root> 
    <DataDictionary> 
    <DataField name="CLASS"> 
     <Value value="0" property="valid"/> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
    </DataField> 
    <DataField name="COUNTRY_CODE"> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     <Value value="3" property="valid"/> 
    </DataField> 
    <DataField name="MARITAL_STATUS"> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     <Value value="3" property="valid"/> 
    </DataField> 
    </DataDictionary> 
    <RegressionModel targetVariable="CLASS"> 
    <ParamMatrix> 
     <PCell name="COUNTRY_CODE" targetCategory="0" coefficient="12"/> 
     <PCell name="MARITAL_STATUS" targetCategory="0" coefficient="34"/> 
    </ParamMatrix> 
    </RegressionModel> 
<root> 

После преобразования, я хотел бы иметь:

<root> 
    <DataDictionary> 
    <DataField name="CLASS"> 
     <Value value="0" property="valid"/> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
    </DataField> 
    <DataField name="COUNTRY_CODE"> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     <Value value="3" property="valid"/> 
    </DataField> 
    <DataField name="MARITAL_STATUS"> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     <Value value="3" property="valid"/> 
    </DataField> 
    </DataDictionary> 
    </Schema> 
    <RegressionModel targetVariable="CLASS"> 
    <ParamMatrix> 
     <PCell name="COUNTRY_CODE" targetCategory="0" coefficient="12"/> 
     <PCell name="MARITAL_STATUS" targetCategory="0" coefficient="34"/> 
    </ParamMatrix> 
    </RegressionModel> 

    <!--other transformations --> 

    <RegressionTable targetVariable="CLASS" targetCategory="1" /> 
    <RegressionTable targetVariable="CLASS" targetCategory="2" /> 
<root> 

Существуют другие преобразования, которые я не перечисляю здесь. У меня проблема с элементами 2 'RegressionTable' в конце файла. Логикой, используемой для построения преобразования, является:

  1. получить значение атрибута 'targetVariable' элемента 'RegressionModel'. В этом случае значением является «КЛАСС».
  2. для элемента 'DataDictionary/DataField', где атрибут 'name' имеет то же значение, что и в шаге 1, пройти через дочерние узлы 'Value'
  3. для каждого элемента Value из шага 2, если его атрибут 'value' не равна к значению атрибута 'targetCategory' первого 'RegressionModel/ParamMatrix/PCell', мы добавим элемент

элемент выглядит следующим образом:

<RegressionTable 
    targetVariable=DataDictionary/DataField/@name 
    targetCategory=DataDictionary/DataField/Value/@value /> 

Я очень благодарен за вашу помощь. Благодарю.

+0

Я потерялся в вашем описании. Вы хотите перечислить узлы 'Value', перечисленные в разделе' '(потому что' ') и сравнить их со значением первого' PCell'? Даже если первый «PCell» назван «COUNTRY_CODE»? –

+0

@ michael.hor257k да. Я знаю, это звучит странно. Но это фактически часть файла модели логистической регрессии. В PCell значение targetCategory является целевым значением, которое должно быть предсказано с использованием этой модели. – Fischlein

ответ

0

Если я следовать вашим инструкциям дословно (AFAICT):

XSLT 1,0

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

<xsl:key name="dataField" match="DataField" use="@name" /> 

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

<xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <xsl:apply-templates select="RegressionModel" mode="reg-tab"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="RegressionModel" mode="reg-tab"> 
    <xsl:variable name="targetVariable" select="@targetVariable" /> 
    <xsl:variable name="targetCategory" select="ParamMatrix/PCell[1]/@targetCategory" /> 
    <xsl:for-each select="key('dataField', $targetVariable)/Value[@value != $targetCategory]"> 
     <RegressionTable targetVariable="{$targetVariable}" targetCategory="{@value}" /> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

я получаю следующий результат:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <DataDictionary> 
     <DataField name="CLASS"> 
     <Value value="0" property="valid"/> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     </DataField> 
     <DataField name="COUNTRY_CODE"> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     <Value value="3" property="valid"/> 
     </DataField> 
     <DataField name="MARITAL_STATUS"> 
     <Value value="1" property="valid"/> 
     <Value value="2" property="valid"/> 
     <Value value="3" property="valid"/> 
     </DataField> 
    </DataDictionary> 
    <RegressionModel targetVariable="CLASS"> 
     <ParamMatrix> 
     <PCell name="COUNTRY_CODE" targetCategory="0" coefficient="12"/> 
     <PCell name="MARITAL_STATUS" targetCategory="0" coefficient="34"/> 
     </ParamMatrix> 
    </RegressionModel> 
    <RegressionTable targetVariable="CLASS" targetCategory="1"/> 
    <RegressionTable targetVariable="CLASS" targetCategory="2"/> 
</root> 

, который не является точно результат, который вы показать ,

+0

Привет, Майкл, спасибо, использование reg-tab для меня нова. Еще один вопрос: что, если элементы должны быть созданы внутри элемента 'RegressionModel'? – Fischlein

+0

спасибо, использование reg-tab для меня нова. Еще один вопрос: что, если элементы должны быть созданы внутри элемента 'RegressionModel', после некоторого преобразования в том же элементе 'RegressionModel'? может использоваться внутри ? – Fischlein

+0

"* что, если элементы должны быть созданы внутри элемента 'RegressionModel' *, тогда нет необходимости обрабатывать' RegressionModel' дважды - и будет существовать один, немодальный шаблон, соответствующий ему, и обработка как " * некоторое преобразование * "и создание элементов . –